0x01 題目
#GOAL: get password from admin;
<?php
error_reporting(0);
$link = mysqli_connect('localhost', 'xxx', 'xxx', 'test');
if (!$link) {
die('Could not connect to MySQL: ' . mysqli_connect_error());
}
$link->set_charset("utf8");
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='select * from user where username=\''.$username.'\' AND password=\''.$password.'\';';
var_dump($query); //提示:htmlentities函數(shù)的效果可以通過(guò)右鍵查看網(wǎng)頁(yè)源代碼來(lái)看效果
echo "<br />";
$result=mysqli_query($link,$query);
if(!$result || mysqli_num_rows($result) < 1){
die('Invalid password!');
}
$row = mysqli_fetch_assoc($result);
echo "Hello ".$row['username']."</br>";
echo "Your password is:".$row['password']."</br>";
?>
0x02 解題
原題不是這樣的,里面加了我自己的注釋和數(shù)據(jù)庫(kù)信息,有一個(gè)比較坑的是htmlentities()函數(shù)需要右鍵源代碼才能看到效果。。
然后分析一下代碼,首先已知用戶名admin,目標(biāo)是獲取密碼。其中username和password都使用了一個(gè)自定義的clean函數(shù)進(jìn)行過(guò)濾,看一下clean函數(shù),首先使用stripslashes函數(shù)去掉反斜杠,然后返回通過(guò)htmlentities()函數(shù)編碼的字符串,并且在函數(shù)中使用了ENT_QUOTES,將單引號(hào)和雙引號(hào)都進(jìn)行實(shí)體編碼,因此不能使用單引號(hào)進(jìn)行注入,但是htmlentities函數(shù)是不編碼反斜杠的,因此我們可以通過(guò)輸入一個(gè)反斜杠,轉(zhuǎn)義掉一個(gè)單引號(hào),從而完成注入,payload如下:
?admin\&password=%20or%201=1%23
