下午在学习审计的时候。想写一个sql注射的来练练手
<?php $id=@$_REQUEST['id']; if(!$conn = @mysql_connect("localhost","root","root")) die; //$getid = "SELECT first_name, last_name FROM dvwa.users WHERE user_id = '$id'"; $getid = "SELECT first_name, last_name FROM dvwa.users WHERE user_id = ".$id; //echo $getid; $result = mysql_query($getid,$conn); // Removed 'or die' to suppres mysql errors //var_dump($result); $num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind' //利用@屏蔽了输出的错误信息。所以只能是盲注了 $i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name"); $last = mysql_result($result,$i,"last_name"); $html .= '<pre>'; $html .= 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; $html .= '</pre>'; echo $html; $i++; } ?>
然后用MYSQL监控的发现两个语句得到的结果是不一样的
然后各自丢到mysql里面去执行发现结果还真的不一样
后来darksn0w大大告诉我
MYSQL里面的引号里面,是常量。后面的非法字符会被舍弃。
赶脚和php的机制一样,又字符串朝整型转换的时候,会从前到后转换直到遇到第一个非法字符,保留前面的部分。
SELECT first_name, last_name FROM dvwa.users WHERE user_id = '1 and updatexml(1,concat(0x7e,(version())),0)'
实际就是:
SELECT first_name, last_name FROM dvwa.users WHERE user_id = '1'
神奇的单引号。是不是可以考虑用于过滤sql注入呢?
标签:none