SQL联合查询,注意有源码看源码,Base64以及32的区别,MD5碰撞
打开后有登录框,先随意登录尝试
只有输入admin才是返回wrong pass!
其他返回wrong user
所以用户名字段一定要输入admin
养成好习惯,先查看源码
看到一段被注释掉的
MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
这里看上去像是Base编码但是不知道哪一种,查了一下,这个肯定是Base32
区分base64、32、16
Base64: 包含大写字母(A-Z),小写字母(a-z),数字(0-9)以及+/;Base32: 而Base32中只有大写字母(A-Z)和数字234567;
Base16: 而Base16就是16进制,他的范围是数字(0-9),字母(ABCDEF);
顺便说一句,当ASCll用Base加密达不到所对应的位数的时候用=号补齐;
在这里附带由三种Base加密的:I love you!
Base64:SSBsb3ZlIHlvde+8gQ==
Base32:JEQGY33WMUQHS33V566IC===
Base16:49206c6f766520796f75efbc81
原文链接:https://blog.csdn.net/qq_40836885/article/details/83793972
解码三次,拿到一句select * from user where username = '$name'
这道题的注入点很明显在username
尝试1’or’1,返回 do not hack me
or这些肯定被过滤了
尝试联合查询注入
替换’admin’的位置,可以发现其应该要在第二个字段上才正确
到这里,密码pw要怎么输入呢,注意本题给了源码,肯定要看的。。
我们知道登录后的页面是search.hp
先看看这个页面的代码
果不其然,当数组arr
[1]为‘admin’,进行判断:
当password
被md5处理后的值和数组arr[2]
中的值一致
输出flag
那么问题是这个password
是我们输入的还是联合查询里面的?核对一下
回头看代码
可以看到数组arr
是从$result
中读取的,$result
来自sql查询
同时password
来自于POST传参
由练习4知道 md5(数组)
返回 NULL
所以payload我们可以写做name=ad' union select 1,'admin',NULL #&pw[]=111
(中间不要乱加空格,比如在=符号的两边)
flag{d81fdb9a-4984-4d4a-9f9a-2784d03168cd}