<a href="#MIDDLE" ><h3>点击跳转到MIDDLE级别</h3></a><a href="#HIGN"><h3>点击跳转到HIGN级别<h3></a>
1.LOW级别:
输入1' OR '1'='1
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
第一个'闭合查询语句中的'号,然后1=1又使等式恒真从而读取了什么数据。

与数据库中的内容核对,结果一致

<a id="MIDDLE">--------------------------------------------------------------------------------------------------------------------</a>
2.MIDDLE级别:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysql_real_escape_string( $id );
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Display values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
//mysql_close();
}
?>
可以看到,Medium级别的代码利用mysql_real_escape_string函数对特殊符号
\x00,\n,\r,,’,”,\x1a进行转义,同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。
使用burpsuite抓包改包:


<a id="HIGN">--------------------------------------------------------------------------------------------------------------</a>
3.HIGN级别:
<?php
if( isset( $_SESSION [ 'id' ] ) ) {
// Get input
$id = $_SESSION[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id LIMIT 1;";
$result = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Get values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
mysql_close();
}
?>
可以看到,与Medium级别的代码相比,High级别的只是在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。但可以被注释掉,只能防止一般的sqlmap注入,还是可以手注出来。

网站怎么避免被SQL注入?
1.参数化查询,提前编译sql语句,使注入失效
2.掐死'号,不让程序被截断
3.限制数据库权限,不允许读写文件,拒绝除select之外的一切不必要操作。