什么是xss
跨站脚本攻击?
跨站??
xss能做什么?
js能做的一切,xss都能做。
可是我好像对Js还不是很了解
csrf与xss的本质区别?
角度一:
工作原理:
- XSS:
攻击者发现XSS漏洞——构造代码——发送给受害人——受害人打开——攻击者获取受害人的cookie——完成攻击
- CSRF:
攻击者发现CSRF漏洞——构造代码——发送给受害人——受害人打开——受害人执行代码——完成攻击
而且XSS容易发现,因为攻击者需要登录后台完成攻击。管理员可以看日志发现攻击者。
而CSRF则不同,他的攻击一直是管理员自己实现的,攻击者只负责了构造代码。
CSRF借助受害者的cookie骗取服务器的信任,但是并不能获取到cookie,也看不到cookie的内容。
角度二:
有的,XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。
CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
xss的分类
反射型xss
反射XSS原理
反射XSS是XSS分类中最多的,他们原理是下面这样:
Hacker——发现存在反射XSS的URL——根据输出点的环境构造XSS代码——进行编码、缩短(可有可无,是为了增加迷惑性)——发送给受害人——受害打开后,执行XSS代码——完成hacker想要的功能(获取cookies、url、浏览器信息、IP等等)
感想
在做xss(1-10)题的时候,就是看输入的变量出现在那些语句中,那些标签中,这个就是这个输入变量的所处环境。
然后看过滤了什么,由于黑盒测试、又是手工挖掘的时候,不知道它怎么过滤了,那么就要有自己的fuzzing list,一开始做的很慢就是没有相关的list。然后也不知道怎么过滤。
有一些过滤方法是 跟sql注入中过滤方法是相同或有相似之处的。
本质就是:变量+函数
这道题看距过滤左什么参数就不要用,并且看距源代码当前所处位置是否已经闭合了,看是否插入关键代码就可以
存储型xss
DOM型xss
这个还不是很肯定
区别:
反射型xss和存储型xss的区别?
有无存储在数据库中。
xss的模型
一。
<HTML 标签></HTML 标签> [输出] <HTML 标签></HTML 标签>
<HTML 标签>[输出]</HTML 标签>
二。
<script>...[输出]...</script>
<style>...[输出]...</script>
三。
输出在 HTML 属性里的情况
挖掘xss
怎么手工挖掘xss
手工的话,记住一句话“见框就插、改数据包不可见部分、改URL参数、js分析”
xss的原理
dvwa xss (low)
源代码:
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
$html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
分析:
在输入框中输入语句后,先检查input是否为空,如果不为空,会将input语句放在一个HTML <pre>
标签
里面。
浏览器在解析的时候,HTML解码->js解码,解析到<script>
标签后,将之后的这段代码交给js解析器去解析,执行alert()语句实行弹框。
漏洞利用:
input = <script>alert(/xss/)</script>
dvwa xss (medium)
源代码:
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
分析:
相比low级别,medium多了将input中的值过滤了<script>
,过滤的方法是用str_replace搜索替换掉。
因此要绕过,绕过的方法有
漏洞利用:
- 双写绕过
input = <scr<script>ipt>alert(/xss/)</scr<script>ipt>
由于只匹配了一次,所以过滤后剩下<script>alert(/xss/)</script>
,可成功弹窗
- 大小写混淆绕过
input = <Script>alert(/xss/)</Script>
直接绕过过滤,可直接弹窗
- 编码绕过
dvwa xss (high)
源代码:
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
. : 匹配除“\n”之外的任何单个字符。
* : 匹配前面的子表达式零次或多次。
分析:
换了个函数,用的是preg_replace(),str_replace()只能替换一次,而preg_replace()可以无限次匹配,由尖括号开始的script标签,不区分大小写。
无法使用<script>
标签注入XSS代码,但是可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
漏洞利用:
输入<img src=1 onerror=alert(/xss/)>
,成功弹框:
dvwa xss(Impossible)
源代码
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
$html .= "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
分析:
- PHP htmlspecialchars() 函数
把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:
可以看到,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。
- HTMLSpecialChars重要性
如果不用HTMLSpecialChars,就会导致读取时,要把" <script>"
之类的HTML标签“原本”的输出,而这一输出就有漏洞了,万一那个插入数据库的人是黑客,插入的不是一般的字符串,而是 “ <script> <b> <body>”
等等之类的东西,读取后,就是一个HTML文档之类的东西,这样,他可以利用这个漏洞欺骗其他人,或者借这个漏洞攻击别人等等,搞个框架跳转到某一网站等等操作。
简言之,用户输入的如何东西都不当标签。
漏洞利用:
None
xss绕过方式
编码绕过原理
绕过方法:
双写绕过
- 替代函数
直接基于黑名单思想替换掉某些字符串,如果只是替换了一次的话,那么就双写该字符串,就可以达到绕过的目的。
大小写混淆绕过
- 替代函数
直接基于黑名单思想替换掉某些字符串,如果区分大小写的话,那么只要大小写绕过即可。
原因不是语言的原因,没查资料之前我还以为js不区分大小写呢。。。。
JavaScript中的变量是区分大小写的 JavaScript语言是区分大小写的。
换别的标签
- 正则表达式替换
如果用不了某个标签比如<script>
,那么这个时候我们就可以选择别的标签。
那么除了<script>
,还有啥标签可以用呢?
最近的感想
ctf&靶机
多精练点好的ctf的题,如果是看过答案再做出来的话,之后要再做一次,巩固一下。
刚开始做ctf会比较难,但是坚持下去就会好很多。
感觉自己现在是有点排斥ctf的,之所以排斥ctf可能是因为一开始做ctf的题时的体验不太好,哈哈哈。
多半是因为自己的基础太薄弱了,在做ctf 题目的时候,就算知道了提示之后,也不知道从何下手。
接下来可以找一些高质量的ctf题目去做做。
选择题目的标准
- 有源码
- 有write up
这个标准的本质:从黑盒(做题)和白盒(看源码)的角度去做一遍。
然后再理清一下自己的思路,看看别人的write up ,借鉴一下别人的思路。
然后积累一下。
还有一个必要就是 用mind map将做过的题目分门别类的放入其中,日后看起来就知道自己练习哪些attack face
做练习
3个角度:
- 黑盒
- 白盒
- fuzzing灰盒测试
这3个的思路都是不一样的。
黑盒:
需要步骤list&testing list
白盒:
看代码就是:函数+变量
每一句都看懂即可
还可以调试
灰盒:
工具?
attack face
接触面要光,多积累攻击面,知道在拿到一个站点之后应该从何下手,有哪些步骤。
在做过一个点之后,精练过后就算是积累了一个attack face。
然后之后碰到类似相关的点,应该更多的是经验能够唤起记忆。
又或者自己需要多整理出一些锚点
从两个角度去看待这个attack face问题
技巧:
多做几次,练熟之后,会利用一些基本的工具。
但是不要反反复复做同质化的工作道:
要有一个research者的心态,多看一些好的paper。
要有更广的攻击面,积累更多知识。
比如
- 密码学(应用密码学)
- 浏览器相关的知识(如何编码解码、如何解析html、js代码)
交流
多跟行内人员交流。
代码审计:
- 找一些简单的cms来看代码(从开发者的角度出发)
- 如果在mac上环境搭建不ok,直接用虚拟机跟着教程做一遍吧
tips:
- 白盒测试和黑盒测试的思路是完全不一样的。
- XSS 的存在,一定是伴随着输入,与输出 2 个概念的。
- 要想过滤掉 XSS,你可以在输入层面过滤,也可以在输出层面过滤。
- 如果输入和输出都没过滤。 那么漏洞将是显而易见的。