Web安全----SQL注入


前言

时至今日,SQL注入仍是广大渗透爱好者聚焦的攻击方式,每四年更新一次的OWASP TOP 10【链接: link】都能够看到它的身影。今天,很荣幸和大家一起来探讨研究学习SQL注入的一些内容,如有不合适或者不正确的地方,欢迎大家留言。


一、什么是SQL注入

SQL(结构化查询语言) 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。

凡是和数据库有交互的地方都容易出现SQL注入,所以我们可以根据这一思路去思考某个点是否存在注入。四个常见的注入点的位置:GET参数中、POST请求中、Http头中、Cookies中。

如何判断注入点是否可行:

大多数情况下我们都会使用与,或,非的逻辑来进行测试:
and 1=1 正常
and 1=2 错误(显示的页面与正常下的页面存在差别)
那这就说明,我们写入的语句被后端执行,进行了判断。

思考:参数x存在注入,下面哪个注入测试正确?
a:www.kaka.com/index.php/?y=1 and 1=1 & x=2
b:www.kaka.com/index.php/?y=1 & x=2 and 1=1
c:www.kaka.com/index.php/?y=1 and 1=1 & x=2 and 1=1
d:www.kaka.com/index.php/?xx=1 and 1=1 & xxx=2 and 1=1

答案:bc
URL中&是连接不同参数的间隔符;and是数据库中与关系,对前面查询语句进行追加限定作用。
例如:

在这里插入图片描述
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
在这里插入图片描述
注意:对于?id=xx(数字)这样的注入点,如此操作可行。如果是字符,很可能因为进行了闭合操作从而无法使其生效。
例如:
在这里插入图片描述
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在这里插入图片描述
需要我们进行闭合操作

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

二、SQL注入操作

1.SQL注入类型

SQL注入的分类:

2-1按照参数进行分类

按照参数进行分类:数字型注入,字符型注入

数字型注入:
在这里插入图片描述
字符型注入:【注入点需要先进行单引号的闭合,才能进一步进行注入】
在这里插入图片描述

2-2按照请求方式进行分类

按照请求方式分类:GET注入,POST注入,Cookie注入,Http Header注入
GET注入:
直接在URL后的注入点直接进行SQL语句的构造,以上属于GET注入

POST注入:【看POST提交的请求体中的数据,在其中进行SQL语句的构造】
在这里插入图片描述
Cookie注入
在这里插入图片描述
Http Header注入
在这里插入图片描述

2-3.是否回显

是否回显:显注(报错),盲注
这个相信大家看名称就能知道他们的不同
一个显注很显然就是会有一些明显变化的返回;盲注就是啥啥不清楚,没有特别明显的变化

2.文件读写

load_file(‘’):读取函数

mysql> select load_file('D:\\phpstudy_pro\\WWW\\sqli-labs-master\\kaka.txt');

在这里插入图片描述
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
into outfile:写文件

mysql> select '小飞棍来咯' into outfile 'D:\\phpstudy_pro\\WWW\\sqli-labs-master\\666.txt';

在这里插入图片描述

3.具体注入操练【手工注入】

3-1.SQL常用知识

在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等
information_schema.schemata:获取所有数据库信息
information_schema.tables:获取所有表的信息
information_schema.columns:获取所有列的信息

与select结合使用
version():查找数据库版本信息
database():查看数据库名字
@@version_compile_os:查看操作系统

union:联合查询,用于合并两个或多个 SELECT 语句的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为UNION或UNION ALL。要注意的是UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型,每条 SELECT 语句中的列的顺序必须相同

3-2.常规注入

使用最开始的注入点判别方式,判断注入点是否有效。之后结合order by,union,select以及构造的SQL注入语句进行SQL注入操作。
例题:Less-2
判断完存在注入点后,order by 后面加数字可以判断服务器在查询某个表时所查询的列数。
在这里插入图片描述
在这里插入图片描述
这里可以看出,存在3个字段

查看回显显示的位置在哪里
在这里插入图片描述
找到回显的位置,接下来可以开始构造SQL语句进行攻击。
备注:这里将原来的1改为-1,为的就是页面上回显位置有限,如果使用1,那么它会将原先正确页面的信息显示在页面上,导致union联合查询后的信息的位置被霸占了,无法显示。

浅浅直捣一下下黄龙
在这里插入图片描述
备注:
1.group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函数参数(就是字段名)决定。正是因为有它的存在,才能够将列中的所有信息一同显示出来,否则只能显示第一个
2.security.users:表示security数据库下的users表

3-3.报错注入

补充知识:
常用的报错函数:
1.updatexml()
updatexml(1,concat(0x7e,payload),0)
在这里插入图片描述

2.extractvalue()
extractvalue(1,concat(0x7e,payload))
在这里插入图片描述

3-4.盲注

补充知识:
1.if语句: if(payload,A,B)【A表示正确执行的东西,B表示错误执行的东西】
sleep(if(length(database())=1,5,0))
2.ascii():将括号内的字符转换成ASCII码
3.substr(a,b,c):从b位置开始,截取字符串a的c个长度
4.mid(a,b,c):从b位置开始,截取a的第c位【取一位】

3-4-1.基于时间的盲注

思路原理:
时间盲注又称延迟注入,个人理解,适用于页面不会返回错误信息,只会回显一种界面,其主要特征是利用sleep函数,制造时间延迟,由回显时间来判断是否报错。
本次例题选取的不好,因为仍存在返回值,但思路是时间盲注的思路,嘿嘿偷个小懒✌
SQL语句:

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and if(ascii(substr((select database()),1,1))>155599,1,sleep(5))--+
语法解释:如果当前数据库的第一个字符的ascii码大于155599,那就返回1,否则网页加载5秒。
【security为当前数据库,如果语句改为=115,则瞬间完成】
后面可通过不断切换当前数据库名的字符的ACII码比较,从而判断数据库名儿。

在这里插入图片描述

3-4-2.基于布尔的盲注

思路原理:
布尔盲注一般适用于页面没有回显字段(不支持联合查询),且web页面返回True 或者 false,
构造SQL语句,利用and,or等关键字来其后的语句 true 、 false使web页面返回true或者false,
从而达到注入的目的来获取信息的一种方法。【正确和错误的返回页面仍有细微的差别】

SQL语句:

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and  left((select database()),1)='s' --+
语法解释:left(a,b)表示从左侧截取a的前b位,这里表示判断该数据库的第一位是不是s,是的话会返回带有
【you are in......】的页面,不是的话就返回啥都没有的页面。

在这里插入图片描述
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在这里插入图片描述

3-5.其他注入

还有堆叠注入,二次注入,DNSlog注入,宽字节注入,加解密注入等没有说,奈何自己也是小白白,很多东西也没有接触到,只能浅浅和大家聊一聊,深入探究可以去看看其他博主的文字。

3-5-1.堆叠注入

**堆叠注入:**命令行中,每一条语句结尾加==;,表示语句结束。而;==之后继续构造语句会一起被执行。
在这里插入图片描述++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在这里插入图片描述
除了向目标数据库内插入自行创建的内容,同样也可以往目标设备中插入一些奇奇怪怪的东西,比如小飞棍~,也可以是一句话木马。

3-5-2.二次注入

思路原理:所谓二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到SQL查询语句中导致的注入。二次注入是sq注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到SQL查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到sql查询。

3-5-3.DNSlog【浅浅了解一下】

思路原理:一台域名解析服务器将你发出的域名解析为IP的时候,会自动生成一份日志,日志当中记录着访问时间,请求域名,映射出来的IP是什么等等。如果读取到这个日志,即可获得一部分目标的信息。
这里需要使用开放的DNSlog平台链接: dnslog平台
在这里插入图片描述
通过设置my.ini来配置,需要设置secure_file_priv=""才可以load_flie任意磁盘的文件。应用条件较为苛刻,可以玩玩还是可以的,这里就不掩饰了哈,摸个小🐟。

三、绕过WAF执行SQL注入(safedog)

一些小小的思路
1.注入数据上进行操作:大小写,双写,编码解码,特殊符号,注释符号混用等等
2.其他:FUZZ大法,数据库特性,垃圾数据溢出,HTTP参数污染等等

1.操练

1-1内联注释,编码,注释符号混用

在这里插入图片描述

+++++++++++++++++++++++++++++++++++++++++++++
在这里插入图片描述
发现:WAF主要拦截union select同时出现的场景。所以我们的思路就是将其分开!
很难受,之前能用的的语句,现在在写文章想要复现时,,,,发现被修复了!!!!!啊啊啊啊啊!
之前的SQL构造:
+1+:?id=-1 union %23%0a select 1,2,3 --+
+2+:?id=-1 union /*//*/*!50001 select */ 1,2,database(/*!50001*/) --+
太可惜了!!!

1-2HTTP参数污染

思路原理:HTTP参数污染漏洞(HTTP Parameter Pollution)简称HPP,由于HTTP协议允许同名参数的存在,同时,后台处理机制对同名参数的处理方式不当,造成“参数污染”。攻击者可以利用此漏洞对网站业务造成攻击,甚至结合其他漏洞,获取服务器数据或获取服务器最高权限。

在这里插入图片描述
本次实验环境采用:WAMP【Windows+Apache+MySQL+PHP】
在这里插入图片描述

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在这里插入图片描述
说明:此时安全狗匹配到的数据时带有注释的部分,正常请款下没有执行。但参数污染导致接受到的真实数据却正常执行SQL语句。

真正SQL注入还得看FUZZ测试,奈何水平太菜😄,不然高低整两个。

总结

本次小文章介绍了一些常见的SQL注入的手工注入思路,没有利用自动化攻击去进行测试,虽然效率很低,而且很难遇到,不过思路也很重要呀。
以上内容可能有些浅显,求知欲强的小伙伴建议再去看一些有深度的文章,有好的推荐欢迎留在评论区啊啊!!!好东西要拿出来分享才是~

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值