---
url: "https://pay.weixin.qq.com/doc/v3/partner/4013059740.md"
title: "Web漏洞检测及修复"
doc_id: 4013059740
---

>更新时间：2025.03.21

Web漏洞是指以各种语言（PHP、JSP、C++等）开发的CGI/Web Service中存在的安全漏洞。

下面是漏洞的定义，检测方法以及修复方案。



## 1. 注入漏洞

### 1.1 SQL注入漏洞

名称： SQL注入漏洞（SQL Injection）

描述：Web程序代码中对于用户提交的参数未做过滤就直接放到SQL语句中执行，导致参数中的特殊字符打破了SQL语句原有逻辑，黑客可以利用该漏洞执行任意SQL语句。

检测方法：通过修改参数来判断是否存在漏洞。

修复方案：

1. 针对ASP.NET的防XSS库，Microsoft有提供统一的方法，具体可以参见如下链接:


[http://www.cnblogs.com/hcmfys/archive/2008/07/11/1240809.html](http://www.cnblogs.com/hcmfys/archive/2008/07/11/1240809.html)

1. 针对其它语言如下细分：


在代码级对带入SQL语句中的外部参数进行转义或过滤：

（1）对于整数，判断变量是否符合\[0-9\]的值；其他限定值，也可以进行合法性校验

（2）对于字符串，对SQL语句特殊字符进行转义(单引号转成两个单引号，双引号转成两个双引号)。关于这点，PHP有类似的转义函数mysql\_escape\_string和mysql\_real\_escape\_string。

建议：

（1）使用腾讯[CMEM](http://wiki.open.qq.com/wiki/CMEM)存储方案；

（2)对与数据库进行交互的用户请求数据，要先做过滤，防止SQL注入。

### 1.2 XSS漏洞

名称：XSS注入漏洞（Cross-site Scripting）

描述：Web程序代码中把用户提交的参数未做过滤就直接输出到页面，参数中的特殊字符打破了HTML页面的原有逻辑，黑客可以利用该漏洞执行恶意HTML/JS代码、构造蠕虫传播、篡改页面实施钓鱼攻击等。

检测方法：通过修改参数来判断是否存在漏洞。

比如用户输入内容：’<u>a</u>”的时候，合法的显示是： ’<u>a</u>” ，合法的显示的源码是：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/bf6220d70841fb4069801a90d905dc72.png)

而存在漏洞的页面显示却是：’a”

源码是：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/87c2f03cab8d048aaff64828177c3a1f.png)

修复方案：

1. 开发者应该严格按照


openid和openkey的校验规则判断openid和openkey是否合法，且判断其它参数的合法性，不合法不返回任何内容。

1. 严格限制URL参数输入值的格式，不能包含不必要的特殊字符（ %0d、%0a、%0D 、%0A 等）。


1. 针对ASP.NET的防XSS库，Microsoft有提供统一的库，具体可以参见如下链接


微软官网：[http://msdn.microsoft.com/en-us/library/aa973813.aspx](http://msdn.microsoft.com/en-us/library/aa973813.aspx)

1. 具体的js方法如下：


（1）对于用户输入的参数值展现在HTML正文中或者属性值中的情况，例如：

展现在html正文中：<a href='http://www.contoso.com'>Un-trusted input</a>

展现在属性值中：<input name="searchword" value="Un-trusted input">

此时需要将红色的不可信内容中做如下的转码(即将< \> ‘ “ \` 转成html实体)：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/e5c31963adc4b97048538b434c68206a.png)

（2）对于用户输入落在<script>的内容中的情况，例如:

需要将红色的不可信内容中做如下的转码: \[a-zA-Z0-9.-\_,\]以及ASC值大于0x80之外的所有字符转化为\\x\*\*这种形式，例如：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/d4e249d18bbe8cba40569052d524d850.png)

### 1.3 命令注入漏洞

名称：命令注入漏洞（Command Injection）

描述：Web程序代码中把用户提交的参数未做过滤就直接使用shell执行，攻击者可以执行任意系统命令。

检测方法：通过修改参数来判断是否存在漏洞。

修复方案：在代码级调用shell时，对命令行中的特殊字符进行转义（\|、&、；等），防止执行其他非法命令。

PHP中可使用escapeshellarg、escapeshellcmd来转义。

### 1.4 HTTP响应头注入漏洞

名称：HTTP响应头注入漏洞（HTTP-Response-Splitting，HTTP\_header\_injection）

描述：Web程序代码中把用户提交的参数未做过滤就直接输出到HTTP响应头中，攻击者可以利用该漏洞来注入HTTP响应头，可以造成xss攻击、欺骗用户下载恶意可执行文件等攻击。

另外根据国际安全组织司acunetix统计，以下apache存在header injection漏洞：1.3.34/2.0.57/2.2.1。

检测方法：通过修改参数来判断是否存在漏洞。

比如国内某著名网站曾经出现过header注入漏洞，抓包时发现：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/7fe0933b2b45c8546e35bfb24ffc6f2b.png)

修复方案：

1. 在设置HTTP响应头的代码中，过滤回车换行（%0d%0a、%0D%0A)字符。

2. 不采用有漏洞版本的apache服务器，同时对参数做合法性校验以及长度限制，谨慎的根据用户所传入参数做http返回包的header设置。


### 1.5 跳转漏洞

名称：跳转漏洞

描述：Web程序直接跳转到参数中的URL，或页面引入任意的开发者URL。

检测方法：修改参数中的合法URL为非法URL。例如测试一下如下URL：

http://\*\*\*.qq.com/cgi-bin/demo\_es.cgi?backurl=http://www.\*\*\*.com，看是否会跳转到注入的http://www.\*\*\*.com站点。

修复方案：在控制页面转向的地方校验传入的URL是否为可信域名。

例如以下是一段校验是否是腾讯域名的JS函数：

function VaildURL(sUrl)

{

return (/^(https?:\\/\\/)?\[\\w\\-.\]+\\.(qq\|paipai\|soso\|taotao)\\.com($\|\\/\|\\\)/i).test(sUrl)\|\|(/^\[\\w\]\[\\w\\/\\.\\-\_%\]+$/i).test(sUrl)\|\|(/^\[\\/\\\\]\[^\\/\\\\]/i).test(sUrl) ? true : false;

}

### 1.6 XML注入漏洞

名称：XML注入漏洞

描述：Web程序代码中把用户提交的参数未做过滤就直接输出到XML中。

检测方法：通过修改参数来判断是否存在漏洞。

修复方案：在代码级输出时对XML特殊字符（“<”、“>”、“>\]\]”）进行转义。

## 2. 信息泄露漏洞

### 2.1 PHPInfo()信息泄露漏洞

名称：PHPInfo()信息泄露漏洞

描述：Web站点的某些测试页面可能会使用到PHP的phpinfo()函数，会输出服务器的关键信息。如下图所示：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/392194bdbba0659e30792623d3902f07.png)

检测方法：访问http://\[ip\]/test.php 以及http://\[ip\]/phpinfo.php看是否成功。

修复方案：删除该PHP文件。

### 2.2 测试页面泄露在外网漏洞

名称：测试页面泄露在外网漏洞

描述：一些测试页面泄露到外网，导致外界误传公司被黑客入侵。如下图所示：

http://parts.baby.qzoneapp.com/

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/27dd5bd1334346aea03715146750d934.png)

http://parts.baby.qzoneapp.com/test.php

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/428fbe3ef11ced7668a11e63fd60c9ab.png)

http://other.baby.qzoneapp.com

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/668dfd2119d3a8a8e6584bd3d910545e.png)

检测方法：检测页面内容，看是否是测试页面。

修复方案：删除测试页面，例如test.cgi，phpinfo.php，info.pho， .svn/entries等。

### 2.3 备份文件泄露在外网漏洞

名称：备份文件泄露在外网漏洞

描述：编辑器或者人员在编辑文件时，产生的临时文件，如vim自动保存为.swp后缀、UltrlEditor自动保存.bak后缀等，这些文件会泄露源代码或者敏感信息。如下图所示：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/94e49be9cf24a260d04e0134dd7414c7.png)

泄露源代码可以让黑客完全了解后台开发语言、架构、配置信息等。下图是国内某著名网站曾经出现过的源代码泄露漏洞：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/65cec61c18d0bf880d8cc79148f97f14.png)

检测方法：在cgi文件后面添加.bak、.swp、.old、~等后缀探测。

修复方案：删除备份文件。

### 2.4 版本管理工具文件信息泄露漏洞

名称：版本管理工具文件信息泄露漏洞

描述：版本管理工具SVN和CVS会在所有目录添加特殊文件，如果这些文件同步到Web目录后就会泄露路径等信息。如下图所示：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/2d98a54c0045a00a235e5561c1a63bd9.png)

检测方法：访问http://\[ip\]/CVS/Entriesp 以及http://\[ip\]/.svn/entriesp看是否成功。

修复方案：删除SVN各目录下的.svn目录；删除CVS的CVS目录。

### 2.5 HTTP认证泄露漏洞

名称：HTTP认证泄露漏洞

描述：Web目录开启了HTTP Basic认证，但未做IP限制，导致攻击者可以暴力破解账号密码。如下图所示：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/e361a3a6823813e336b93f46d454b3cb.png)

修复方案：限制IP访问该目录。

### 2.6 管理后台泄露漏洞

名称：管理后台泄露漏洞

描述：管理后台的账号和密码设计过于简单，容易被猜测到，导致攻击者可以暴力破解账号密码。如下图所示：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/15d273234b9b465e3746b754dadb81cc.png)

修复方案：

1. 将管理后台的服务绑定到内网ip上，禁止开放在外网。

2. 如果该管理后台必须提供给外网访问，则未登录页面不要显示过多内容，防止敏感信息泄露，登录账号需经过认证，且密码设置规则尽量复杂，增加验证码，以防止暴力破解。


### 2.7 泄露员工电子邮箱漏洞以及分机号码

名称：泄露员工电子邮箱漏洞以及分机号码

描述：泄露员工内部电子邮箱以及分机号码相当于泄露了员工内部ID，可以为黑客进行社会工程学攻击提供有价值的材料，同时也为黑客暴力破解后台服务提供重要的账号信息。

修复方案：删除页面注释等地方中出现腾讯员工电子邮箱以及分机号码的地方。

### 2.8 错误详情泄露漏洞

名称：错误详情泄露漏洞

描述：页面含有CGI处理错误的代码级别的详细信息，例如sql语句执行错误原因，php的错误行数等。

检测方法：修改参数为非法参数，看页面返回的错误信息是否泄露了过于详细的代码级别的信息。

修复方案：将错误信息对用户透明化，在CGI处理错误后可以返回友好的提示语以及返回码。但是不可以提示用户出错的代码级别的详细原因。

## 3. 请求伪造漏洞

### 3.1 CSRF漏洞

名称：CSRF漏洞（Cross Site Request Forgery）

描述：用户以当前身份浏览到flash或者开发者网站时，JS/flash可以迫使用户浏览器向任意CGI发起请求，此请求包含用户身份标识，CGI如无限制则会以用户身份进行操作。

检测方法：

1. 在实际的测试过程中，测试人员需要判断操作是否为保存类操作，是否强制为POST方式传输参数。


判断方式是通过抓包工具把所有的POST参数都改成GET方式提交。

需要注意的是，这种方法只可防止图片跳转式CSRF漏洞，如果页面上有XSS漏洞话，CSRF无法防御。

2.最简单的办法就是查阅该cgi是否带有无法预知的参数，例如随机字符串等。

修复方案：可使用以下任意办法防御CSRF攻击：

1. 在表单中添加form token（隐藏域中的随机字符串）；

2. 请求referrer验证；

3. 关键请求使用验证码。


### 3.2 JSON-hijackin漏洞

名称：JSON-hijackin漏洞

描述：CGI以JSON形式输出数据，黑客控制的开发者站点以CSRF手段强迫用户浏览器请求CGI得到JSON数据，黑客可以获取敏感信息。

检测方法：

1. 检查返回的json数据是否包含敏感信息，例如用户ID，session key，邮箱地址，手机号码，好友关系链等。

2. 确认提交是否带有无法预知的参数，例如随机字符串等。


修复方案：可使用以下任意办法防御JSON-hijackin攻击：

1. 在请求中添加form token（隐藏域中的随机字符串）；

2. 请求referrer验证。


## 4. 权限控制漏洞

### 4.1 文件上传漏洞

名称：文件上传漏洞

描述：接受文件上传的Web程序未对文件类型和格式做合法性校验，导致攻击者可以上传Webshell（.php、.jsp等）或者非期望格式的文件（.jpg后缀的HTML文件）

修复方案：文件上传的CGI做到：

1. 上传文件类型和格式校验；

2. 上传文件以二进制形式下载，不提供直接访问。


### 4.2 crossdomain.xml配置不当漏洞

名称：crossdomain.xml配置不当漏洞

描述：网站根目录下的文件crossdomain.xml指明了远程flash是否可以加载当前网站的资源（图片、网页内容、flash等）。

如果配置不当，可能带来CSRF攻击。如下图所示：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/6205b2394d72cb15280a4ea5b8faa7be.png)

检测方法：

访问http://\[domain\]/crossdomain.xml 修复方案：对于不需要外部加载资源的网站，crossdomain.xml中更改allow-access-from的domain属性为域名白名单。

修复大致样本参考如下（备注：示例中的app10000.qzoneapp.com,app10000.imgcache.qzoneapp.com请修改为自己指定的站点）：

<?xml version="1.0"?>

<cross-domain-policy>

<allow-access-from secure="false" domain="\*.qq.com"/>

<allow-access-from secure="false" domain="\*.soso.com"/>

<allow-access-from secure="false" domain="\*.paipai.com"/>

<allow-access-from secure="false" domain="\*.gtimg.cn"/>

<allow-access-from secure="false" domain="\*.pengyou.com"/>

<allow-access-from secure="false" domain="app10000.qzoneapp.com"/>

<allow-access-from secure="false" domain="app10000.imgcache.qzoneapp.com"/>

</cross-domain-policy>

### 4.3 flash标签配置不当漏洞

名称：flash标签配置不当漏洞

描述：网页在引入flash的时候，会通过object/embed标签，在设置的时候，如果一些属性配置不当，会带来安全问题：

1. allowScriptAccess：是否允许flash访问浏览器脚本。如果不对不信任的flash限制，默认会允许调用浏览器脚本，产生XSS漏洞。


always（默认值），总是允许；sameDomain，同域允许；never，不允许

2.allowNetworking：是否允许flash访问ActionScript中的网络API。如果不对不信任的flash限制，会带来flash弹窗、CSRF等问题。

all，允许所有功能，会带来flash弹窗危害；internal，可以向外发送请求/加载网页；none，无法进行任何网络相关动作（业务正常功能可能无法使用）

修复方案：对于不信任flash源，allowScriptAccess设置为never，allowNetworking设置为none（业务需要可以放宽为internal）。

### 4.4 embed标签配置不当漏洞

名称：embed标签配置不当漏洞

描述：网页会通过embed标签引入媒体文件（如rm、avi等视频音频），这些媒体文件中如有脚本指令（弹窗/跳转），如果没有限制就会出现安全问题。

检测方法：检查embed标签中是否有invokes标签。

修复方案：添加属性invokes值为-1。

### 4.5 并发漏洞

名称：并发漏洞

描述：攻击者通过并发http/tcp请求而达到次获奖、多次收获、多次获赠等非正常逻辑所能触发的效果。

下面以简化的例子说明在交易的Web应用程序中潜在的并行问题，并涉及联合储蓄账户中的两个用户（线程）都登录到同一账户试图转账的情况：

账户A有100存款，账户B有100存款。用户1和用户2都希望从账户A转10分到账户B.

如果是正确的交易的结果应该是：账户A 80分，账户B 120分。

然而由于并发性的问题，可以得到下面的结果：

用户1检查账户A （ = 100 分）

用户2检查账户A （ = 100 分）

用户2需要从账户A 拿取10 分（ = 90 分） ，并把它放在账户B （ = 110 分）

用户1需要从账户A 拿取10分（仍然认为含有100 个分）（ = 90 分） ，并把它放到B（ = 120 分）

结果：账户A 90 分，账户B 120 分。

检测方法：发送并发http/tcp请求，查看并发前后CGI 功能是否正常。例如：并发前先统计好数据，并发后再统计数据，检查2次数据是否合理。

修复方案：对数据库操作加锁。

### 4.6 Cookie安全性漏洞

名称：Cookie安全性漏洞

描述：cookie的属性设置不当可能会造成其他SNS游戏的运行出错等安全隐患。

检测方法：抓取数据包查看cookie的domain属性设定是否合理。

修复方案：对cookie字段的domain属性做严格的设定，openkey以及openid的domain只能设置到子域，禁止设置到父域qzoneapp.com。如下图所示：

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/1546cfa4c1691265ac82e199221418d3.png)

### 4.7 Frame-proxy攻击漏洞

名称：Frame-proxy攻击漏洞

描述：在一些老版本浏览器（比如IE6）下，Frame-proxy攻击可以把非常驻XSS漏洞以常驻型的方式做攻击。

修复方案：qzoneapp.com域名下的应用不能再通过iframe嵌入qq.com域名下页面。

原理如下图所示，假设域名xiaoyou.qq.com底下没有任何xss漏洞，然后xiaoyou.qq.com通过iframe嵌入了一个xxx.qzoneapp.com域名。

假设qq.com的某个子域vul.qq.com存在一个非常驻的xss漏洞，那么当xxx.qzoneapp.com通过iframe嵌入vul.qq.com时，访问xiaoyou.qq.com域名的用户将受到常驻型XSS漏洞的攻击。

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/ef260d3f26ac9fb781eafe9d65b63193.png)