- 简介
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。(百度百科)
- Security Level:Low
源码如下:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
$html .= "<pre>ID: {$id}<br />名字: {$first}<br />姓氏: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
服务器没有对参数id做任何过滤便直接将其带入查询语句。
解法A:手动注入
(1)判断是否存在注入,以及注入类型。
输入1页面返回正常
输入1'页面返回错误,说明存在注入点
假设是数字型,输入1 and 1=2,页面返回正常,说明不是数字型。
输入1' and '1'='2,查询正常进行,但因为此逻辑式值为假,不会返回任何符合条件的结果,说明存在字符型注入。
(2)猜解SQL语句中的字段数,因为显示名字和姓氏,从2开始猜,正确显示。
<