题目链接 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注入题目,后来发现有mysql_real_escape_string 防护了。百思不得其解。难度是弱口令题目?
查看网页源码发现贴出了guest/guest 账号密码,但是PHP又限制了id 不能是guest 怎么办?答案是填写 GUEST和guest就可以过了。 原来MySQL查询的= 是不区分大小写的,本题考察的其实是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)
总结:
1)做WEB题目第一点还是要看网页本身源码、还有包头;很多时候注释里会给提示。
2)MySQL 查询不区分大小写
3)mysql_real_escape_string 可以预防SQL注入,但是要注意编码。宽字节绕过漏洞