漏洞自动化验证之XSS篇

0x01 XSS简介

XSS是一个非常常见的Web漏洞,各大互联网公司对XSS的重视程度差别很大,有的作为高危,有的最多当中危甚至当低危,原因无非是这两方面:一方面是XSS虽然数量过多但是利用时需要很多前置条件,不容易成功利用;另一方面一但被成功利用危害又较大,会造成盗取帐号、控制数据、盗窃资料、网站挂马等危害。

0x02 XSS漏洞检测

绝大多数Web漏洞扫描器都可以检测出某一网站是否存在XSS漏洞,网上也能找到很多专用的XSS检测工具,具体的原理及检测过程不再赘述。有兴趣可查看极客学院的课程《XSS检测与防御》

0x03 XSS自动化验证

验证的前提是已经确认某页面存在XSS漏洞,并有成功触发的POC(Web漏洞扫描器都会返回吧?)。

验证的思路如下:

  • 判断该POC的发送方式:GET和POST
  • 若为GET,直接发送即可触发
  • 若为POST,拆分POC,本地构造输入框,提交POST请求
  • 触发后自动截图

1、判断发送方式

此处使用的是某厂商的Web漏扫,很人性化的提示当前使用的POC是用那种方式提交,不用自己进行判断,其他情况后续再做补充。

GET:


xss_get.png

POST:


xss_post.png

2、浏览器操作

既然是漏洞验证,得提供充足的证据来证明该漏洞确实是存在的。对于XSS来讲,截取浏览器界面,证明POC触发成功是一个强有力的证据,所谓“无图无真相”嘛。此处就得操作浏览器了。

浏览器操作选用selenium + Firefox。

安装selenium

代码是用python写的,所以基础环境为 Windows 10 + python 2.7。
安装selenium只需要一条命令:

pip install selenium
下载Firefox driver

selenium需要驱动程序与你所选的浏览器进行连接。Firefox需要安装geckodriver才能正常运行,同时,确保它在你的PATH环境中。

下载地址:geckodriver

其他受支持的浏览器也有自己的驱动程序可用。一些更受欢迎的浏览器的驱动程序下载链接如下:

Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads

Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

selenium简单操作

简单说下selenium的操作,编写代码,让浏览器依次执行以下指令:

  • 打开一个新的Firefox浏览器
  • 加载百度主页
  • 等待一段时间
  • 关闭浏览器

代码如下:

from selenium import webdriver

driver = webdriver.Firefox()

driver.get('https://www.baidu.com')
driver.implicitly_wait(10)

driver.quit()

3、漏洞验证

如果漏洞POC触发方式为GET时,在上面代码的基础上稍作修改,增加窗口最大化以及截图功能即可实现。

关键代码如下:

......

maxWidth = driver.execute_script("return window.screen.availWidth;")
maxHeight = driver.execute_script("return window.screen.availHeight;")
driver.set_window_size(maxWidth, maxHeight)

......

if driver.switch_to_alert():
    printScreen.printScreen('crackme2.bmp')
    
......

有关自动截图部分的内容请看Python调用Win32 API实现截图

因为selenium操作浏览器时,不支持直接发送POST请求,如果触发方式为POST时,则需要先构造表单,用浏览器模拟点击操作来发送POST请求。

表单构造

从Web漏扫获取到的风险点中,POST触发方式的链接多为如下形式:

http://***.***.com:80/register/register.php?FirstName=135791&LastName=135791&Password=admin&DOB=135791&Address=135791&txtCity=135791&drpState=Alabama&TelephoneNo=13412312345&Email=admin@admin.com&UserId=admin>'><ScRiPt>window.a==1?1:prompt(a=1)</ScRiPt>

构造表单的目的只是用来向服务器发送一个POST请求,所以,越简单越好。

  • 拆分获取到的url

从Web漏扫获取存在XSS漏洞的风险点,首先拆分出使用的网络协议、域名、路径以及传递的参数。

import urlparse

url = "http://crackme.cenzic.com:80/kelev/register/register.php?FirstName=135791&LastName=135791&Password=admin&DOB=135791&Address=135791&txtCity=135791&drpState=Alabama&TelephoneNo=13412312345&Email=admin@admin.com&UserId=admin>'><ScRiPt>window.a==1?1:prompt(a=1)</ScRiPt>?qqdrsign=042c6"

res = urlparse.urlparse(url)

scheme = res[0]
host = res[1]
path = res[2]
data_string = res[4]
  • 构造表单内容

将传递的参数进一步拆分,还原成表单,生成html代码。

form = ''
s = data_string.split('&')
        
for i in range(0, len(s)):
    p = s[i].split('=', 1)
    inputName = p[0]
    inputValue = p[1]
    tr = '<tr><td align=right><b>' + inputName + ':</b></td><td><input type=text name="' + inputName + '" value="' + inputValue + '" size=80></td></tr>'
    form = form + tr
  • 构造页面

添加html代码,生成完整的.html文件,方便浏览器使用。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <title>WebApi</title>
        
        <style>
            body{ font-size:14px;  font-family:"Microsoft Yahei";background-color:#fff;}
            td{table-layout: fixed; word-wrap:break-word;word-break:break-all;}
        </style>
    </head>
    <body>
        <table border=0 width='90%'>
            <tr>
                <td align=right style=width:120px;>
                    <b>url(Action):</b>
                </td>
                <td>
                    <a id=id_action target=_blank href="{{ url_base }}">{{ url_base }}</a>
                </td>
            </tr>
        
            <form name=theForm action="{{ url }}" method=post>
            {% csrf_token %}
            
                {% autoescape off %}

                    {{ form }}

                {% endautoescape %}
            <tr>
                <td></td>
                <td>
                    <input onclick="theForm.action=document.getElementById('id_action').href;" id=id_input_action type=submit value=' 使用Action提交POST数据 '>
                </td>
            </tr>
            </form>
        </table>
    </body>
</html>

效果图如下:

xss_form.png
发送POST请求

XSS验证表单构造完毕后,下一步即为发送POST请求。在前文“selenium简单操作”部分的代码基础上,增加点击过程即可。

首先,定位元素名为“id_input_action”的按钮,然后执行点击操作,紧接着判断是否有弹窗,最后截图保存到当前目录。代码如下:

driver.find_element_by_id("id_input_action").click()
time.sleep(3)
if driver.switch_to_alert():
    printScreen.printScreen('crackme2.bmp')

0x04 生成报告

此处为了简便,直接生成html报告,后期需要,也可转换成pdf等格式。

构造报告模板

此处为了简便,可以直接生成html报告,后期需要,也可转换成pdf等其他格式。

构造方式可参考上文表单构造部分内容,只需要传入存在漏洞的链接以及存放图片的路径即可,也可按自己想法或需求,增加漏洞产生的原因、解决方案等内容。

0x05 效果展示

脚本运行后,先从扫描器结果中获取XSS漏洞的url(涉及到api请求与处理),分析当前url触发方式,选用不同的提交方式去触发,最后截图保存(也可以直接写入word文件中)。

crackme2.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容