題目鏈接?wargame??
$id=mysql_real_escape_string(trim($_POST['id']));
$ps=mysql_real_escape_string(trim($_POST['ps']));
$row=mysql_fetch_array(mysql_query("select?*?from?user?where?id='$id'?and?ps=md5('$ps')"));
if(isset($row['id'])){
if($id=='guest'||$id=='blueh4g'){
echo"your?account?is?blocked";
}else{
echo"login?ok"."";
echo"Password?:?".$key;
}
題目可以查看源代碼如上,意思是說要在用戶密碼表里找到記錄,而且用戶名不能是guest和blueh4g 。剛開始以為是一條SQL注入題目,后來發(fā)現(xiàn)有mysql_real_escape_string 防護(hù)了。百思不得其解。難度是弱口令題目?
查看網(wǎng)頁源碼發(fā)現(xiàn)貼出了guest/guest 賬號密碼,但是PHP又限制了id 不能是guest 怎么辦?答案是填寫 GUEST和guest就可以過了。 原來MySQL查詢的= 是不區(qū)分大小寫的,本題考察的其實是MySQL。做個試驗吧:
mysql> select * from users where name="GUEST" and password = 'guest';
+-------+----------+
| name? | password |
+-------+----------+
| guest | guest? ? |
+-------+----------+
1 row in set (0.00 sec)
mysql> select * from users where name="Guest" and password = 'guest';
+-------+----------+
| name? | password |
+-------+----------+
| guest | guest? ? |
+-------+----------+
1 row in set (0.00 sec)
總結(jié):
1)做WEB題目第一點(diǎn)還是要看網(wǎng)頁本身源碼、還有包頭;很多時候注釋里會給提示。
2)MySQL 查詢不區(qū)分大小寫
3)mysql_real_escape_string 可以預(yù)防SQL注入,但是要注意編碼。寬字節(jié)繞過漏洞