作者:黄ll明雪_742 | 来源:互联网 | 2023-09-09 15:11
在留言页面..messageSub.php发现在注册时发现第9行,往数据库插入语句时,将留言经过 clean_input($_POST['message'])函数进
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 "Not Found
17
The requested URL ".$_SERVER[‘PHP_SELF‘]." was not found on this server.
"
;
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输入,留言
成功将账号密码读了出来!