2019年10月5日星期六

XSS进阶(一)

XSS进阶(一)

直接接着上文http://xss.fbisb.com中的题,以下的题请使用FireFox进行测试,chrome会默认禁止执行url中的script代码,导致无法弹窗

L2

先尝试搜索 然后审查元素:
有两处出现了回显,但是观察第一行,我们的代码直接原封不动的回显出来,估计八成就是HTML实体编码了,这个没办法,没法绕过。那么下面那条语句会不会是一个突破口呢?
尝试构造:"><script>alert(/xss/)</script>
成功闭合前面的标签,完成突破,弹窗完毕

L3

还是先尝试搜索:<script>alert(/xss/)</script> ,然后审查元素
和上图是一样的,于是尝试'><script>alert(/xss/)</script> ,只不过这次是用单引号闭合的
发现<,>,' 都被转义了,那么这个时候就想,既然闭合不了,那么能不能通过给标签新加一个属性,来达到运行JavaScript的目的呢?
尝试:'onfocus='alert(/xss/)' 当点击文本框时实现弹窗(觉得实现效果不好的话可以尝试添加其他的事件属性)

L4

还是先尝试搜索:"><script>alert(/xss/)</script> ,然后审查元素,
发现尖括号被过滤了,那尝试上面的思路如何呢?构造'onfocus='alert(/xss/)' 发现应该把单引号换成双引号去闭合,即:"onfocus='alert(/xss/)'完成弹窗

L5

尝试搜索:"><script>alert(/xss/)</script> ,然后审查元素:
发现在尖括号中的script会被替换成scr_ipt,导致-->
反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器。

存储型

把xss.php内容改为(同时数据库中需要配置相应的表):
\\存储XSS演示
<form action="" method="post">
    <input type="text" name="xss"/>
    <input type="submit" value="test"/>
</form>
php
$xss=@$_POST['xss'];
mysql_connect("localhost","root","123");
mysql_select_db("xss");
if($xss!==null){
    $sql="insert into temp(id,payload) values('1','$xss')";
    $result=mysql_query($sql);
    echo $result;
用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。
新建show.php,内容为:

mysql_connect("localhost","root","root");
mysql_select_db("xss");
$sql="select payload from temp where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
   echo $row['payload'];
该代码从数据库读取了之前插入的内容,并将其显示出来。
先创建一个数据库xss,创建temp表
然后访问xss.php,像之前一样输入 HTML 代码
点击test,点击之后却发现没有任何动静,但事实上,我们的数据已经插入到了数据库中。
当我们访问show.php查询这个值的时候,代码就会被执行。
存储型 XSS 的执行位置通常不同于输入位置。我们可以看出,存储行 XSS 的数据流向是:
浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
3.dom-xss
把xss.php内容改为
php
error_reporting(0); //禁用错误报告
$name = $_GET["name"];
?>
<input id="text" type="text" value="$name;?>" />
<div id="print"></div>
<script type="text/javascript">
var text = document.getElementById("text"); 
var print = document.getElementById("print");
print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>
DOM-XSS 的数据流向是:URL-->浏览器
总结: 在易用上,存储型XSS > DOM - XSS > 反射型 XSS。
注:反射型xss和dom-xss都需要在url加入js代码才能够触发。

总结

本质来说,xss产生的原因也是"代码"和"数据"产生了混淆,将用户提交的"数据"未经过滤就直接并入到代码中,当用户可控的数据被当作代码部分执行时们也就产生了xss攻击。 站在防御者的角度上,应该注意每一个用户可控的数据提交部分,严格的对数据进行"消毒",尽量避免直接将用户数据和代码进行拼接后返回。 而站在攻击者的角度,由于我们不知道哪些部分是被直接拼合的,所以需要测试所有可提交数据的地方,同时需要观察数据的返回是怎么被拼接的,具体在那个标签中,对于xss攻击者来说,需要考虑两点:怎么让js引擎解析自己的代码和怎么绕过服务器或waf的过滤机制。
今天就说一下原理部分,明天结合题来进行实践,进一步理解xss。
今日。。同样没有分享。。。

XSS速查表

今天继续XSS的进一步学习,以下内容转载自Freebuf上的文章,原文章来自OWASP的xss备忘录 1.介绍 这篇文章的主要目的是给专业安全测试人员提供一份跨站脚本漏洞检测指南。文章的初始内容是由RSnake提供给 OWASP,内容基于他的XSS备忘录: http://...