0%

XSScon源码-Simple XSS Scanner tool

Pre:

同事在用XSSCon来测试xss漏洞,然后发现run不起来,然后我帮它debug了一下,顺手提了pr.

我稍微瞄了一下这个工具的xss scanner的代码,发现精简得很,所以看一看它源码.


检测效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
__  ______ ____   ____
\ \/ / ___/ ___| / ___|___ _ __
\ /\___ \___ \| | / _ \| '_ \ {v0.5 Final}
/ \ ___) |__) | |__| (_) | | | | https://github.com/menkrep1337/XSSCon
/_/\_\____/____/ \____\___/|_| |_|
<<<<<<< HEAD

[16:20:31] [INFO] Starting XSSCon...
***************
[16:20:31] [INFO] Checking connection to: http://testphp.vulnweb.com
[16:20:32] [INFO] Connection estabilished 200
[16:20:32] [WARNING] Target have form with POST method: http://testphp.vulnweb.com/search.php?test=query
[16:20:32] [INFO] Collecting form input key.....
[16:20:32] [INFO] Form key name: searchFor value: <script>console.log(5000/3000)</script>
[16:20:32] [INFO] Form key name: goButton value: <Submit Confirm>
[16:20:32] [INFO] Sending payload (POST) method...
[16:20:33] [CRITICAL] Detected XSS (POST) at http://testphp.vulnweb.com/search.php?test=query
[16:20:33] [CRITICAL] Post data: {'searchFor': '<script>console.log(5000/3000)</script>', 'goButton': 'goButton'}
***************
[16:20:34] [INFO] Checking connection to: http://testphp.vulnweb.com/index.php
[16:20:36] [INFO] Connection estabilished 200
[16:20:36] [WARNING] Target have form with POST method: http://testphp.vulnweb.com/search.php?test=query
[16:20:36] [INFO] Collecting form input key.....
[16:20:36] [INFO] Form key name: searchFor value: <script>alert(6000/3000)</script>
[16:20:36] [INFO] Form key name: goButton value: <Submit Confirm>
[16:20:36] [INFO] Sending payload (POST) method...
[16:20:37] [CRITICAL] Detected XSS (POST) at http://testphp.vulnweb.com/search.php?test=query
[16:20:37] [CRITICAL] Post data: {'searchFor': '<script>alert(6000/3000)</script>', 'goButton': 'goButton'}
***************
[16:20:39] [INFO] Checking connection to: http://testphp.vulnweb.com/categories.php
[16:20:40] [INFO] Connection estabilished 200
[16:20:40] [WARNING] Target have form with POST method: http://testphp.vulnweb.com/search.php?test=query
[16:20:40] [INFO] Collecting form input key.....
[16:20:40] [INFO] Form key name: searchFor value: <script>alert(6000/3000)</script>
[16:20:40] [INFO] Form key name: goButton value: <Submit Confirm>
[16:20:40] [INFO] Sending payload (POST) method...
[16:20:41] [CRITICAL] Detected XSS (POST) at http://testphp.vulnweb.com/search.php?test=query
[16:20:41] [CRITICAL] Post data: {'searchFor': '<script>alert(6000/3000)</script>', 'goButton': 'goButton'}
[16:20:41] [WARNING] Found link with query: cat=1 Maybe a vuln XSS point
[16:20:41] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script>
[16:20:41] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E
[16:20:42] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E
[16:20:42] [WARNING] Found link with query: cat=2 Maybe a vuln XSS point
[16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script>
[16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E
[16:20:42] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E
[16:20:42] [WARNING] Found link with query: cat=3 Maybe a vuln XSS point
[16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script>
[16:20:42] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E
[16:20:43] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E
[16:20:43] [WARNING] Found link with query: cat=4 Maybe a vuln XSS point
[16:20:43] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=<script>alert(6000/3000)</script>
[16:20:43] [INFO] Query (GET) : http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert%286000%2F3000%29%3C%2Fscript%3E
[16:20:43] [CRITICAL] Detected XSS (GET) at http://testphp.vulnweb.com/listproducts.php?cat=%3Cscript%3Ealert(6000/3000)%3C/script%3E
***************

省略了很多,通过输出可以大致了解一下他的流程。。


搭建靶机环境:

phpstudy + xss练习平台代码. 方便调试…

1
http://192.168.0.107/xss/level2.php


主要流程:

命令行参数解析:

都是常规的一些参数,所以就略过.

可以看到里面含cralwer参数,可见是个带有爬虫功能的主动发包的scanner.


检查可用性:

在开始探测之前,会检查一下该url的"连通性".

作者本意是通过返回包的状态码status_code,认为大于400就是"连接失败".

这里用connection应该是不准确的.

有任一状态码都认为是服务器有回复,即是连通的.
连通性有问题的话,应该是请求超时,服务器无响应.

所以,这里我觉得是检查该探测行为(xss检测)情况下,这个url的可用性.

xss检测的话,只要能正常访问页面,状态码是2xx或者3xx都是ok的.

而检测服务器报错的时候,状态码是5xx也是ok的。

检测服务器报错的时候常常是构造异常的url(数据包),服务器无法正常处理,然后报错,可能会把报错信息输出在页面上.

这种情况下,状态码一般都是5xx(大于400),那么是这个时候服务器是有响应的,有处理你的请求的,不能认为是连通性有问题.

不同检测方式,判定url的可用性应该是不一样的


三类请求的检测:

get_method:

形式:get方法提交的键值对参数

例如:xxx.com/index.php?id=1

判断方式是看xss payload有没在返回包的源码中,简单粗暴但容易误报.

这里面还有个细节就是发了两次请求包.

为什么要发两次请求包呢?要多发个urlencode后的包呢?

因为有些特殊的字符要urlencode之后,服务器才能正常正确的处理.例如&等.
之前在写api的时候,试过token值里面带了&这个符号后,api程序不能正常解析,认为这是个不合法的token.

**HTTP协议中参数组件的传输是key=value键值对的形式,如果要传输多个参数就需要用&符号对键值对进行分隔。**例如?name1=value1&name2=$value2,这样在服务器收到这种字符串的时候,会用“&”分隔出每一个参数,然后再用“=”来分隔出参数值。

如果我的参数值中就包含=或者&这样的特殊子字符的时候,该怎么办。比如说name1=value1,其中value1的值是va&lu=e1,那么在传输过程中就会变成name1=va&lu=e1用户传输的本意是只有一个键值对,但是服务器端会解析成两个键值对,这样就自然的产生了歧义。

**URL编码只是简单的在特殊字符的各个字节(16进制)前加上%即可。**例如,我们对上述会产生歧义的字符进行编码后的结果:name1=va%26lu%3D,这样服务器会把紧跟在%后的字节当成普通的字节,不会把它当成各个参数或键值对的分隔符。


get_method_form:

form表单通过get方法提交.


其中可以学到的点就是

构造请求包的思路:

  • 找到form标签

  • 找出input,textarea属性,解析参数值对


post_method:

form表单通过post方法提交.

这个大体跟get_method_form相似.略过


总结:

这个xss scanner代码量很少,只能算个简单的黑盒静态检测Xss的scanner,容易误报.

  • 代码虽少,但是可以通过这个工具简单的了解到一个黑盒静态检测的xss scanner是怎么写的,也是非常不错的哈哈哈.

  • 不同检测方式,判定url的可用性应该是不一样的

  • 有任一状态码都认为是服务器有回复,即是连通的.连通性有问题的话,应该是请求超时,服务器无响应.

  • **HTTP协议中参数组件的传输是key=value键值对的形式,如果要传输多个参数就需要用&符号对键值对进行分隔。**如果参数值中就包含=或者&这样的特殊子字符的时候,**用户传输的本意是只有一个键值对,但是服务器端会解析成两个键值对,这样就自然的产生了歧义。**这个时候就要用URL编码,URL编码只是简单的在特殊字符的各个字节(16进制)前加上%即可。

含注释的代码在https://github.com/jerrychan807/XSSCon/tree/comment


Refs: