生命在于学习——SQL注入的博弈

一、SQL注入介绍

1、SQL注入简介

SQL注入是指web应用程序对用户输入数据的合法性来进行判断、处理,前端传入的参数是攻击者可控的,并且参数被正常的带入到数据库查询,攻击者可以通过构造不同的SQL语句来进行对数据库的操作,正常情况下,攻击者可以对数据库进行高危操作,例如,数据查询、WebShell写入、命令执行等操作。
注意:SQL注入需要有SQL语言的基础,SQL语言基础后续会发布文章,实际操作会发布在sql-lib文章中。

2、SQL注入原理

SQL注入漏洞的产生需要满足以下两个条件:

  1. 参数是用户可控的,也就是前端传入后端的参数的内容是用户可以控制的。

  2. 参数被带入数据库进行查询,也就是传入的参数被拼接到SQL语句中,并且带入到数据库进行查询。

3、注入判断

当传入的参数为1’时,数据库会执行以下代码并会报错,这是因为不符合数据库语法规范的。
在这里插入图片描述
当传入的参数为and1=1时,不会报错,因为1=1为真,所以返回的页面是正常的,当传入参数为and1=2时,因为条件为假,所以会返回一个不同的结果。
注意:回显是指页面有数据,信息返回,无回显是指根据输入的语句页面没有任何变化,或者没有数据库中的内容显示到网页中。

4、SQL注入流程

判断是否存在注入并且判断注入类型

  1. 判断字段数order by
  2. 确定回显点union select 1,2
  3. 查询数据库信息@@version @@datadir
  4. 查询用户名,数据库名 user() database()
  5. 文件读取union select 1,load_file(‘C:\windows\win.ini’)#
  6. 写入webshell select … into outfile …
    如果使用sql注入时遇到转义字符串的单引号或者双引号,可以使用HEX编码绕过。

5、SQL注入的危害

  1. 数据库信息泄露:泄露数据库中存放的数据,用户隐私等。
  2. 获取webshell:当权限为root且知道绝对路径时,可以直接写入一句话木马到服务器。
  3. 网页篡改:注入出后台管理员用户,登录后台发布恶意数据,篡改后台数据。
  4. 网站挂马:当拿到webshell或者获取到服务器权限后,可以将一些网页木马挂在服务器上,去攻击。
  5. 获取系统权限:当权限足够高,可以获取系统主机的权限。
  6. 万能密码:利用特定的payload登录后台或其它页面。
  7. 文件读取:读取敏感信息。

二、SQL注入类型

1、简单分类

  1. 安装数据库类型分类 Access、MsSQL、MySQL、Oracle、DB2等
  2. 按照提交方式分类 GET、POST、cookie、HTTP头、XFF
  3. 按注入点类型分类 数字型、字符型、搜索型
  4. 按执行效果分类 布尔盲注、时间盲注、报错注入、联合注入、堆叠查询注入

2、数字型注入

在web端大概是http://xxx.com/news.php?id=1 这种形式,其注入点ID类型为数字,所以叫数字型注入点。这一类的SQL语句原型大概为select * from 表名 where id=1。
简单来说就是最直白简单的一种注入方式。

3、字符型注入

在web端大概是http://xxx.com/new.php?name=admin 这种形式,其注入点name类型为字符类型,所以叫字符型注入点。这一类的SQL语句原型大概为select * from 表名 where name= ‘admin’ 。

4、搜索型注入

一些网站为了方便用户查找网站的资源,都对用户提供了搜索功能,因为是搜索功能,往往是程序员在编写代码都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的系统中普遍存在。
可以在皮卡皮卡网站进行练习。

5、布尔盲注

即可以根据返回页面判断条件真假的注入。
关键在于if(a,b,c),如果a为真,返回b,否则返回c。

6、时间(延时)盲注

即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
关键也在于if(a,b,c),但在这里,b一般为sleep(5),也就是说,a为真,则延迟五秒返回,否则马上返回。

7、报错注入

即页面会返回错误信息,或者把注入的语句结果直接返回在页面中。
有三个函数,extractvalue注入,updatexml注入,floor注入。

8、二次注入

原理是在第一次查询中,将我们后面所需的内容插入进去,在第二次注入的过程中用到他,实现我们的目的。

9、联合注入

可以使用union的情况下注入。
union可以用于很多注入方式中。

10、堆叠查询注入

可以同时执行多条语句的执行时的注入。
具体请见实操,实操文章发布后会在此链接。

11、Cookie注入

具体请见实操,实操文章发布后会在此链接。

12、Referer注入

具体请见实操,实操文章发布后会在此链接。

13、DNS外带

在实际的应用场景中,我们一般在进行SQL盲注时,为了效率,在load_file()函数未被禁用的情况下,我们可以结合一些dnslog平台,进行外带注入。
不管是布尔类型盲注还是时间盲注,都需要发送大量的数据包去判断数据,而这很可能会触发WAF的防护,因此导致IP被封,所以,如果条件允许,我们可以结合DNslog来快速的回显数据。MySQL数据库,通过DNSlog盲注需要用到load_file()函数,该函数不仅能加载本地文件,同时也能对URL发起请求,因此需要使用load_file()函数,需要root权限,并且secure_file_priv需要为空。
注意:利用原理是将dnslog平台中的特有字段payload代入目标发起dns请求,通过dns解析将请求后的关键信息组合成新的三级域名带出,在dns服务器的dns日志中显示出来。

14、窄字节和宽字节

1、宽字节介绍
  1. 当某个字符的大小为一个字节时,称其字符为窄字节
  2. 当某字符的大小为两个字节时,称其字符为宽字节
  3. 所有英文默认占一个字节,汉字占两个字节
  4. 常见的宽字节编码:GB2312,GBK,GB18030,BIG5,SHIFT_JIS
2、宽字节注入原理
  1. 程序员为了防止sql注入,对用户输入中的单引号(')进行处理,在单引号前加上斜杠进行转义,这样被处理后的sql语句中,单引号不再具有作用,仅仅是内容而已。
  2. 而安全人员要绕过这个转义处理,使单引号发挥作用,有两个思路:1、让斜杠失去作用。2、让斜杠消失。
  3. 思路一:借鉴程序员的防范思路,对斜杠进行转义,使其失去转义单引号的作用,成为内容
  4. 思路二:宽字节注入。当使用MySQL使用宽字节编码,如GBK时,两个连在一起的字符会被认为是汉字,我们可以在单引号前加一个字符,使其和斜杠组合被认成汉字,从而达到让斜杠消失的目的,进而使单引号发挥作用。==注意:前一个字符的Ascii要大于128,两个字符才能组合成汉字,如%df%5c%27,此时%df和%5c会被GBK认为是一个汉字,也就是繁体字運,而后面的%27也就是单引号('),这样就绕过了闭合问题。
    具体请见实操,实操文章发布后会在此链接。

三、总结与心得

SQL注入虽然分为了很多种类型,但他们的存在是平级关系,并不存在哪种注入优先级高,只能说具体问题具体分析,针对不同的网站,可能会有多种方式适用,所以碰吧,时间+努力=幸运。
具体请见实操,实操文章发布后会在此链接。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值