审计8 截断注入

Posted 一手重锤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了审计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输入,留言

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

 

 

 

 

 

 

 




 



以上是关于审计8 截断注入的主要内容,如果未能解决你的问题,请参考以下文章

网站漏洞检测公司对wordpress sql注入漏洞代码审计与修复

[JAVA代码审计]OFCMSv1.3.3之前存在SQL注入漏洞

[JAVA代码审计]OFCMSv1.3.3之前存在SQL注入漏洞

审计截断和丢弃

PHP 代码审计之死磕 SQL 注入

2020/1/27代码审计学习