OWASP~SQL注入

文章只做学习知识,禁止违法。

一、简介

    SQL注入是一种Web应用代码中的漏洞。在工作中渗透测试工作时,使用工具扫描、手工注入和绕过WAF注入等找注入点,其中一层不变的构造特殊请求,使其与数据库SQL语句进行闭合。测试完成闭合时会附加其他命令,例如:任意查询命令、创建数据库/表、更新数据库/表的内容,更改用户权限、删除数据/表/数据库、执行系统命令等。

     通俗的讲SQL注入产生的原因是,后台WEB程序代码,没有对B、C端传入的参数过滤判断和基本的设备防护,使攻击者可以修改构造参数,自定义SQL语句让web程序执行,给数据库造成伤害。

二、SQL注入资料

《SqlMap从入门到精通》

靶场:pikachu、vulnhub、墨者学院

很好的博客:HTTP Host 头攻击 -- 学习笔记_白名单校验host头的域-优快云博客

HTTP 请求 Header 中的 Accept-Language 字段中的权重系统介绍-优快云博客

三、探测方法

0x00 手工注入

  1. 与数据库交互的相关页面
  2. 请求头中可能出现注入的地方:http-cookices、referee、user、agent、post等;
  3. 登录的模块、更新数据信息的页面、注册的模块、留言板模块等

0x01 工具找注入点

1、探测工具(SQLMAP)

2、长亭科技 Xray 2.0

3、BP扫描

4、AWVS  15.4、APP-SCAN 10.5

5、代码审计HP-fority

6、Seay PHP代码审计工具2.1公测版

0x02 站点功能模块找注入点

1、登录、注册页面

2、修改(更新)数据页面

3、留言板页面

4、搜索查询页面

5、删除页面

四、SQL注入原理

  程序命令和用户数据之间没有做到泾渭分明,这使得攻击者有机会将程序命令当作用户输入的数据提交给web程序,操作数据库。
切记:注入最终是数据库,与脚本、平台、数据库类型无关;

五、SQL注入框架流程图

六、SQL注入危害现状

        任意查询命令、创建数据库/表、更新数据库/表的内容,更改用户权限、删除数据/表/数据库、执行系统命令等。

        可读取/修改数据库中的库和表、获取用户的账号,密码(可能被加密过),邮箱,联系方式、信用卡信息、修改产品价格、删除数据、可执行系统命令、修改权限,获取系统管理权限、修改任意文件、安装后门等。

七、SQL注入靶场

靶场:pikachu、vulnhub、墨者学院、SQLI-LABS

八、SQL注入的原因

0x00 注入的分类

1、数字型注入(参数=数字)

2、字符型注入(参数=字符)

3、搜索型注入

0x01 注入提交方式

1、GET提交

2、POST提交

3、Cookie提交

4、Http-header-User-Agent注入

5、Http-X-Forwarded-For

6、Http-header-Accpet

0x02 注入攻击类型与方式

 0x00 时间盲注

常用的延时函数指令: repeat、sleep()、benchmark()、WAITFOR DELAY ‘0:0:5’---

payload  kobe' and if((substr(database(),1,1))= 'p',sleep(5) ,null)#
payload  kobe' and sleep(5)#

0x01 布尔型盲注

介绍:如在MySQL中判断数据名长度的输入为1' and length(database()) = 10 #,通过相应的正确与否判断数据名的长度是否为10,猜测数据库中数据的具体内容时,可以借助书本上SUBSTR、LIMIT、ASCII等一些特殊的命令及函数进行猜测;

布尔型盲注常用的函数:ascii()、regexp()、like()、left()、ord()、mid()、substr()

payload  kobe’ or 1=1#
payload  kobe' and 1=1#
payload vince' and ascii(substr(database(),1,1))=112#

 0x02 报错型盲注

        在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息,常见的select/insert/update/delete注入都可以使用报错方式来获取信息.

基于函数报错注入(insert、update、dalete):updatexml()、extractvalue()、floor()

updatexml(xml_document,xpth_string,new_value)

payload

payload k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #

?id=1' and (extractvalue(1,concat(0x7e,(select mid(group_concat(table_name),1,30) from information_schema.tables where table_schema='security'))))--+

 0x03 联合注入

        union操作符用于合并两个或多个SQL语句集合起来,得到联合的查询结果。

联合注入常用函数:database()、user()、version()                

注意:union操作符一般与order by语句配合使用

payload
payload  select id,email from member where username='kevin' union select username,pw from member where id=1;

0x04 堆叠注入

       堆叠注入:从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行在 SQL 中,分号(;)是用来表示一条 sql 语句的结束。试想一下我们在 ; 结束一个 sql 语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而 union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于 union 或者 union all 执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

注意:Union injection(联合注入)也是将两条语句合并在一起,但union或者union all执行的语句类型是有限的,只可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

payload
payload :?id=1’;insert into users(id,username,password) values (‘38’,’less38’,’ruoli’) --+
payload :select * from user where id=1;select load_file('e:/test.txt');        
payload :select * from user where id=1;insert into user(username,password,address,sex,age) values ('范冰冰','123456','北京',2,26);

0x05 宽字节(编码)注入

      宽字节注入的原理基于GBK编码的特性。在GBK编码中,一个汉字由两个字节组成。当在输入的字符前加上%df时,MySQL会将其视为一个汉字,从而忽略掉前面的转义字符。例如,输入“%df'”时,MySQL会将其视为一个汉字“運”,从而使得单引号‘逃逸出来,不再被转义,这样就可以执行SQL注入‌

将输入的字符串进行编码,如base64编码;       

宽字节注入背景:单引号被转义,需要逃逸一下;

宽字节中单引号逃逸过程如下:

1) php.ini中有一个get_magic_quotes_gpc功能,在开启所有的'(单引号),"(双引号),\(反斜线) and 空字符会自动加上转义字符\。
2)以单引号为例子: ?id = 1 %df' and 1=1--+
3)%df' => %df\' (单引号会被加上转移字符\)
4)%df\' => %df%5c' (\的十六进制为%5c)
5)%df%5c' => 縗' (GBK编码时会认为这时一个宽字节)转义字符%5c被吃掉
6)'(单引号)成功逃逸,sql语法正确

0x06 多阶注入

      多阶注入的原理是通过在多个不同的输入点插入SQL代码,每个注入点都可能利用不同的漏洞或权限。例如,攻击者首先通过一个注入点获取基本的数据库信息,然后利用这些信息通过另一个注入点进行更深入的攻击,逐步提升权限。

0x07 XX型注入

username=('xx') or 1=1;

pikachu靶场XX型:') order by 2--+

0x08 HTTP-Header注入

1、Http-header-Accept:客户端能接收的资源类型

2、Http-header-Accept-Encodiing:指定客户端可以理解的内容编码方式。

3、Http-header-Accept-Language:指定客户端解析内容的自然语言

        1、修改字段来改变服务器的响应,这种攻击通常用于攻击处理Accept-language值不当的Web应用程序。

4、Http-header-Connection

5、Http-header-Host:目的是帮助识别客户端要与之通信的后端组件。

        1、攻击者可以通过修改HTTP请求头中的Host字段来尝试访问未经授权的服务或资源。

        2、案例:在某些情况下,例如当前由代理转发时,Host值可能会在到达预期的后端组件之前进行更改。也就发生了Host头攻击。

        3、注意:当碰到单个web服务器托管多个网站或应用程序。多个网站与服务器共享一个公共IP地址,原因是通过代理路由流量,这可能是一个简单的负责平衡设备或某种反向代理服务器。在客户通过内容分发网络(CND)访问网站的情况下,这种设置尤其普遍。

        4、关键点:如果未校验或者直接使用Host头,则Host头可以与一系列其他漏洞“组合拳”攻击,比如:缓存投毒、特殊业务功能的逻辑漏洞、基于路由的SSRF、经典服务端漏洞,如SQL注入(当Host被用于SQL语句时)等。

        5、验证漏洞:修改HTTP头中的Host值,如果观察到响应包中含有修改后的值,说明存在漏洞。

        6、业务场景:HTTP Host头攻击的特点,它被广泛应用于密码重置中毒,窃取重置任意用户密码的令牌。

6、Http-header-Referer:告诉服务器请求是从哪个页面链接过来的。

        1、可以被利用跨站请求伪造(CSRF)攻击;服务器可以通过验证referer头是否来自预期的域;

        2、注意:referer只要在发送GET请求才会发送,而POST请求不包含Referer信息,从而减少攻击面;

7、Http-X-Forwarder-For

        案例: X-Forwarded-For( http请求头注入 ): 127.0.0.1' AND if(length(database())=7,sleep(5),1)

8、User-Agent:了解用户的浏览器和设别信息

       1、如果这些信息被用于动态生成SQL查询,并且没有进行适当的输入验证或转义,那么这里就可能存在SQL注入的风险。

        2、作为整体字符串处理和记录;

        3、整个字段被拼接到SQL查询中,payload覆盖了原有内容。

9、Cookie:Cookie跟踪用户会话和保存用户偏好。

        1、程序错误地将Cookie的内容用于SQL查询,这也可能是一个注入点。

        2、特别是当应用程序使用Cookie中的值来查询数据库时,风险更大。

        3、解析成多个键值对,每个键值对单独处理。

        4、payload插入到特定的键值中,而不是覆盖整个Cookie。

0x09 JSON注入

JSON时存储和交换文本信息的语法,是轻量级的文本数据交换格式。接口数据传输都采用JSON方式进行。JSON文本的MIME类型是"application/json"。

0x03 Access数据库注入攻击者基本技术

0x00 偏移注入

简介:偏移注入是针对Access数据库,当我们注入猜到数据库表名确猜不到字段名的情况下,这种方法就可以帮我们填补。

   ?id=9999 union select 1111,2222,333,4444,* from administrator;

0x04 SQL 注入中的高级查询

0x05 WAF绕过技术

1、WAF是有一个白名单的,在白名单的客户请求将不做检测;安装Bypass Waf插件

2、伪造白名单特殊目录:www.spisec.com/pen/admin/..\news.php?id=1 union select user,password from mysql.user

3、直接攻击源站,原理通过DNS解析到云WAF,访问网站的流量要经过指定的DNS服务器解析,然后进入Waf节点进行过滤,最后访问原始服务器,如果能通过一些手段(比如C段、社工)找到原始的服务器的地址,便可以绕过。

4、复参数绕过:pen/news.php?id=1&id=union&id=select&id=user,password&id=from%20mysql.user

5、Waf触发规则的绕过,策略一:特殊字符替换空格(MYSQL用%0a是换行,SQLServer用/**/代替空格);

6、URL添加垃圾字符

7、编码绕过:http://10.0.0.103:99/sql.php?id=1%26%26%20true;

8、组合绕过Waf:(http://10.0.0.103:99/sql.php?id=1 and mod(8,7) in (1));

9、内联注释绕过:?id=1  union /*!77777cz*//*!77777cz*/ select database/!*77777 a*/() 1,2,3,4#;

10、分块传输:Transfer-Encoding:chunked;

0x07 经典OR注入

1、用户名处输入1' or 1=1 or '1'='1(不含双引号,以下相同),密码处我输入123,其实随便输入什么符号都可以

九、SQL防御方法

1、预编译语句(Prepared Statements)和 参数化查询:这是预防SQL注入的最有效方法之一,预编译使参数传输人不会改变语句的结构;

2、Oracle 数据库可以使用储存过程;

3、使用ORM(对象关系映射)工具;

4、使用适当的错误处理机制;

5、限制数据库权限;

6、使用WEB应用防火区WAF;

7、定期对安全进行审计和代码审查;

8、编写参数过滤器,同时使用参数化查询;

十、SQL注入总结

0x00 基础知识

1、MySQL 、MSSQL、Tomcat、远程桌面连接的端口是多少?

MySQL:默认端口为3306

MSSQL:默认端口为1433

Tomcat:默认端口8080

远程桌面连接:默认端口3389

2、永恒之蓝攻击的是哪个服务和端口?

永恒之蓝攻击主要利用了SMB协议的445端口和139端口。

通过协议可以在计算机间共享文件、打印机、命名管道等资源。

危害:永恒之蓝攻击通过这些端口利用SMB1 和 NBT 中的远程代码执行漏洞,进行勒索病毒、挖矿、反弹shell等攻击。

3、SM-08067是哪个端口?

SM-08067漏洞涉及的是SMB服务的445端口。SM-08067漏洞全称是“Windows Server服务RPC请求缓冲区溢出漏洞”。

加固:1、更新系统和应用;2、配置防火墙;3、使用墙密码;4、定期扫描;

4、平时挖漏洞提交到哪些平台?

1、奇安信补天

2、cnvd

3、教育漏洞平台

4、漏洞银行

5、wooyun

6、漏洞盒子众测平台

0x01 高级知识

1、 不需要任何字母,测试注入点。

http://xxx.xxx.xxx:90/test.php?id=2-1

 2、SQL注入总结

1、抓包要根据包信息和页面功能来判断内容是不是想要的,比如cookie内容;

2、payload选择要判断有一个已知内容为真,就可以用and或者or;判断不了就用or;

0x02 SQL注入监控

1、如何判断SQL注入是否误报?

  答:直接查看攻击IP是否多条语句攻击,只有几条注入语句攻击一般是正常业务造成的,如果一查日志检索发现有攻击IP有大量不同的SQL语句一般是正常攻击。

2、SQL注入有哪些常见的特征?

  答:1、常见的关键字:select、where、order、union、update、floor、exec、information_schema、extractvalue、delete、insert等。

3、SQL注入流量信息

  答:1、流量中含有select、updatexml、floor等数据库操作语句的关键词时,态势感知平台可能会发出SQL注入警告。2、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值