跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。Web程序代码中把用户提交的参数未做过滤就直接输出到页面,参数中的特殊字符打破了HTML页面的原有逻辑,黑客可以利用该漏洞执行恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

0x01 XSS

最简单的一个案例,输入即输出。

漏洞代码示例:

<?php
echo $_REQUEST[ 'id' ];
?>

测试语句:?id=<script>alert(/xss/)</script>

0x02 编码解码

编码解码输出时,可能导致XSS编码绕过的情况

漏洞代码示例:

<?php
$a=urldecode($_GET['id']); //接收参数并进行url解码
$b=htmlspecialchars($a); //HTML ENCODE处理,到这里都是没有问题的
echo urldecode($b); //最后,url解码输出
?>

测试语句:id=%25253Cscript%25253Ealert(/xss/)%25253C/script%25253E

这边代码逻辑中,问题根源在于最后一句的url解码输出,导致存在三重url编码绕过的情况。

根据实际情况,给出安全建议:HTML ENCODE处理后直接输出变量。

0x03 HTML不规范

HTML代码编写不规范,可能导致的问题,我们来看一个案例:

漏洞代码示例:

<?php
$name = htmlspecialchars($_GET['name']);
?> <input type='text' class='search' value='<?=$name?>'>

获取参数,在一个input元素的属性里输出这个变量,我们注意到这里使用的是单引号闭合,而函数默认只是转化双引号("), 不对单引号(')做转义。

因此,可以用单引号闭合,

测试语句:?name=222' onclick='alert(/xxs/)

安全建议:将HTML标签的属性值用双引号引起来。

0x04  黑名单过滤

通过在全局引入过滤函数,提供黑名单过滤,

漏洞代码示例:

<?php
$name = htmlspecialchars($_GET['name']);
$pregs = "/<script>|<\/script>|onclick|oncontextmenu|ondblclick|onmousedown|onmouseenter|onmouseleave|onmousemove|onmouseover|onmouseout|onmouseup|onkeydown|onkeypress|onkeyup/i"; $check = preg_match($pregs, $name);
if ($check) {
echo 'not found';
exit;
}
?> <input type='text' class='search' value='<?=$name?>'>

从html编写不规范,我们可以使用单引号闭合,然后去进一步构造触发事件,可是常见的XSS事件大多都被过滤了,

怎么快速地去找到可以拿来利用的XSS触发事件呢?  答:XSS FUZZ。

前提是要收集积累一些触发事件,利用自己编写python脚本进行fuzz

虽然fuzz出来很多事件,但要结合具体输出位置去分析,找到合适的事件,最终得出Payload。

测试语句:?name=111' onfocus='alert(/xss/)

附XSS FUZZ 脚本:

#! /usr/bin/env python
# _*_ coding:utf- _*_ import requests
import urlparse
import urllib # 使用说明,修改第54行处的字典即可使用,支持GET、POST等简单XSS验证
# url 支持 * 号 如 http://127.0.0.1/test.php?id=1*3333 payload会替换*号内容 global result_dict
result_dict={} def get(url,para,payload):
params={}
result=urlparse.urlparse(url)
params=urlparse.parse_qs(result.query,True)
if '*' in params[para][]:
params[para]=str(params[para][]).replace("*", payload);
else:
params[para]=str(params[para][])+payload
m_url=result.scheme+"://"+result.netloc+result.path
data = urllib.urlencode(params)
geturl = m_url+'?'+data
response = requests.get(geturl)
result_dict[payload]=[response.content,len(response.content),response.status_code]
return result_dict def make_get_resule(url,para):
with open('on.txt') as f:
for payload in f.xreadlines():
payload =payload.strip()
if '#' in payload or len(payload)==:
pass
else:
get(url,para,payload)
result_analysis(payload) def post(url,data,para,payload):
params={}
params=urlparse.parse_qs(data,True)
if '*' in params[para][]:
params[para]=str(params[para][]).replace("*", payload);
else:
params[para]=str(params[para][])+payload response = requests.post(url,data=params,timeout=)
result_dict[payload]=[response.content,len(response.content),response.status_code]
return result_dict def make_post_resule(url,data,para):
with open('on.txt') as f:
for payload in f.xreadlines():
payload =payload.strip()
if '#' in payload or len(payload)==:
pass
else:
post(url,data,para,payload)
result_analysis(payload)
def result_analysis(payload):
if payload in result_dict[payload][]:
print "[+]" + payload +" ok" if result_dict[payload][].count(payload)>:
print "[+]" + payload +" repeat" if __name__ == '__main__':
result_dict={}
methodselect = raw_input("[?] Select method: [G]ET or [P]OST (G/P): ").lower()
if methodselect == 'g':
url = raw_input("Please input url:")
para = raw_input("Please input para:")
if 'https://' in url:
pass
elif 'http://' in url:
pass
else:
url = "http://"+url
make_get_resule(url,para) elif methodselect == 'p':
url = raw_input("Please input url:")
data = raw_input("Please input data:")
para = raw_input("Please input para:")
if 'https://' in url:
pass
elif 'http://' in url:
pass
else:
url = "http://"+url make_post_resule(url,data,para)

0x05  漏洞防护

1、PHP提供了两个函数htmlentities()和htmlspecialchars() ,把一些预定义的字符转换为 HTML 实体。

防御代码示例:

<?php
echo htmlspecialchars($_REQUEST[ 'id' ]);
?>

2、其它的通用的补充性防御手段

.在输出html时,加上Content Security Policy的Http Header
(作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
(缺陷:IE或低版本的浏览器可能不支持)
.在设置Cookie时,加上HttpOnly参数
(作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
(缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
.在开发API时,检验请求的Referer参数
(作用:可以在一定程度上防止CSRF攻击)
(缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。

参考文章:

PHP的防御XSS注入的终极解决方案    https://segmentfault.com/q/1010000004067521

xss防御之php利用httponly防xss攻击  http://www.jb51.net/article/48345.htm

如何正确防御xss攻击   http://lobert.iteye.com/blog/2164741

XSS修复方案  http://webscan.360.cn/vul/view/vulid/2125

PHP代码审计笔记--XSS的更多相关文章

  1. SeacmsV10.7版代码审计笔记

    data: 2020.11.9 10:00AM description: seacms代码审计笔记 0X01前言 seacms(海洋cms)在10.1版本后台存在多处漏洞,事实上当前最新版V10.7这 ...

  2. Web安全学习笔记 XSS上

    Web安全学习笔记 XSS上 繁枝插云欣 --ICML8 XSS的分类和基本认识 XSS的危害 同源策略的基本认识 一.XSS的分类和基本认识 1. 简介 XSS全称为Cross Site Scrip ...

  3. PHP代码审计笔记--弱类型存在的安全问题

    0x01 前言 PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型. 弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整 ...

  4. 代码审计之XSS及修复

    xss在平时的测试中,还是比较重要的,如果存在储存型xss,就可以做很多事情了,打cookie,添加管理员等等很多操作. 以下所有代码都是我自己写的,可能有不美观,代码错误等等问题,希望大家可以指正. ...

  5. QCMS代码审计:XSS+SQL+后台getshell

    qcms是一款比较小众的cms,最近更新应该是17年,代码框架都比较简单,但问题不少倒是... 网站介绍 QCMS是一款小型的网站管理系统.拥有多种结构类型,包括:ASP+ACCESS.ASP+SQL ...

  6. PHP代码审计之XSS操作

    XSS XSS是Cross Site Scripting(跨站脚本攻击), 它与sql注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除的目的,而在XSS攻击中,通过插入 ...

  7. PHP代码审计笔记--变量覆盖漏洞

    变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...

  8. PHP代码审计笔记--CSRF漏洞

    0x01 前言 CSRF(Cross-site request forgery)跨站请求伪造.攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻 ...

  9. 信息安全学习笔记--XSS

    一.XSS简介 XSS (Cross Site Scripting)是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代 ...

随机推荐

  1. 小程序的tab标签实现效果

    swiper制作tab切换 index.html ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <view class="swiper-tab&qu ...

  2. 微信小程序——wxParse使用方法

    wxParse是一个微信小程序富文本解析组件.现在小程序里面自带了一个<rich-text>组件也能解析富文本,但是表现不尽人意.所以我还是采用的wxParse来解析富文本的. wxPar ...

  3. 安卓程序代写 网上程序代写[原]BluetoothServerSocket详解

    一. BluetoorhServerSocket简介 1. 继承关系 public final class BluetoothServerSocket extends Object implement ...

  4. Action.c(37):Error-27791:Server"192.168.2.111" has shut down the connection paematurely

    1)测试的时候最好应用干净的测试环境,即:清楚一切可能干扰的对象:2)如果出了这种错误,要认真的去排查错误,不单单找找脚本,或者[b][url=http://www.ltesting.net/html ...

  5. C# .NET - Sql Bulk Insert from multiple delimited Textfile using c#.net

    SqlBulkCopy.WriteToServer has 4 overloads:SqlBulkCopy.WriteToServer (DataRow[])    Copies all rows f ...

  6. 关于Unity中地形的创建

    地形创建 Raw图片格式是Unity可以导出的图片格式 Unity很强大,可以直接使用psd文件 地形创建实例 1.创建Unity工程和文件目录1:创建一个地形Terrain: GameObject- ...

  7. Linux之查看切换Shell

    1.查看存在的shell cat /etc/shells 2.查看使用的shell echo $SHELL 3.切换shell 切换bash chsh -s /bin/bash 切换zsh chsh ...

  8. SAP 产品条码WMS结合 以及ABAP script的集成 BarCode

    条码和RFID打印解决方案   1, 热转印条码标签打印 热转打印技术的原理是通过加温和加压将色带上的固体油墨熔化转印到介质上完成打印的.通过选择热转印色带与标签材料匹配,热转印打印方式可以产生耐高温 ...

  9. elasticsearch系列六:聚合分析(聚合分析简介、指标聚合、桶聚合)

    一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...

  10. (资源)Git优秀学习资源

    在线教程 Try Git: Git初学者绝不能错过的Git上手资源. 廖雪峰Git教程: 比较系统的中文在线教程 易百Git教程 : 另一个比较全的中文在线教程 Git Immersion : A V ...