代码审计教学 发表于 2020-2-19 23:31:17

代码审计入门教学(四)

代码审计入门教学(四)

什么是XSS

跨站脚本攻击(CrossSite Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意JavaScript代码,当用户浏览该页之时,嵌入其中Web里面的JavaScript代码会被执行,从而达到恶意攻击用户的目的。

常见的XSS种类有反射型XSS、存储型XSS、DOM-XSS。

2.1反射型XSS
反射型XSS一般是指非持久型XSS,网页直接输出请求参数的值到页面上,需要自己去触发或者引诱别人去触发,如在浏览器打开一个包含恶意javascript代码的URL链接,当该链接存在XSS漏洞是服务器就会“反射”javascript代码到我们的浏览器,然后在我们的浏览器上执行恶意javascript代码。该漏洞常出没的地方是搜索框。

2.2存储型XSS
存储型XSS一般是指持久型XSS,先提交内容存入数据库,然后从数据库取出在输出到页面上。存储型XSS会永久性的嵌入到页面,所有访问存在该漏洞的小伙伴都将成为被攻击者。该漏洞常出没的地方是留言板。

2.3DOM-XSS
DOM—based XSS漏洞是基于文档对象模型DocumentObjeet Model,DOM)的一种漏洞,其实小白我也不大懂DOM XSS,做项目的时候也很少遇到过这个,想要了解更多可以自行百度。

3.漏洞原理

小白窃以为要想通过源码挖掘出漏洞,首先得找出漏洞形成的原因。接下来小白将把自己对XSS漏洞形成的原因做一个整理,便于后期查阅。

3.1反射型XSS漏洞原理
从上面可以看出反射型XSS网页直接输出请求参数的值到页面上,其实看过小白之前某一篇文章的话就知道小白不小心写出了个存在XSS漏洞的php脚本。代码大致如下:

index.php


这段代码的意思是获取GET请求的value参数的值赋给$str变量,然后输出$str变量的值到网页上。

可以看出脚本未对value参数的值做输入判断,也未对输出进行编码,也就是说value的值是一段javascript代码也会直接输出到网页咯。这就是反射型XSS的形成原因。于是小白构造好带有恶意javascript代码的URL验证是否属实。

http://www.yuesec.com/index.php?value=<script>alert(/1/)</script>

此处应有弹框:



上面也说过该漏洞常出没的地方是搜索框,我们这个index.php看起来不像搜索框啊!那好,我们直接把index.php改成search.php就好啦!

http://www.yuesec.com/search.php?value=<script>alert(/1/)</script>

此处也有弹框:



嗯嗯,反射型XSS漏洞形成原因通俗地讲就是攻击者可以控制输出到页面的脚本的变量的值,该变量的值一般是通过GET请求控制,且没对传进来的值进行过滤,这样子就构成了反射型XSS漏洞。

3.2存储型XSS漏洞原理
大家都知道存储型XSS是先提交内容存入数据库,然后从数据库取出在输出到页面上。

sxss.php


这是一个简单的存储型XSS脚本,因为没有过滤特殊字符或者方法使用不当,所以就形成了存储型XSS漏洞。

4.审计实践

小白对两种类型的XSS形成原因已经有了一定的了解,接下来就是了解如何挖掘XSS了,看到上面两个小例子,反射型XSS先通过$_GET获取参数值,然后通过echo输出到网页,那么$_GET和echo就是我们的审计关键字了,但是存储型XSS还要提交内容插入到数据库啊,那$_POST、mysql_query和insert into也可以做关键字了。$_GET和$_POST也可以有这几个关键字足够了,其他的大家自己挖掘。

4.1反射型XSS审计实践
接着拿出前几次一直在审计的cms,如果这个cms会说话的话,早就干翻我了。(大家就不要在意它怎么干翻我啦),俗话说,千穿百穿,漏洞不穿。

搜索我们上面提到的关键字$_GET:


如果不去掉正则的话可以这样子写:

\$_GET

查找结果:



筛选搜索结果
①Ctrl+A全选然后复制我们搜索出来的结果,Ctrl+N打开一个新的文档并粘结复制的内容。


②Ctrl+F搜索echo.*?\$_GET,这次需要用到正则了。


可以看到左下角有91个匹配,也就是说可能存在91个反射型XSS,如果都是的话,那“筛子cms”还真是名副其实了。


看了下基本都是后台的,算是有条件的鸡肋反射型XSS吧。

4.1.1.4   增强版关键字筛选
接下来试试增强版的关键字echo.*?\$_GET搜索结果吧,看搜索出来的结果是91个还是更多?


可以看到有15个文件总共有91个匹配结果匹配了我们的关键字,跟上面的结果一致,但是操作却多了,还是增强版关键字好用。

4.2存储型XSS审计实践
存储型因为不是直接输出控制的参数的值,所以不能直接定位到存在漏洞的地方,小白设想存储型XSS简单的审计方法有两种:

①可以先通过mysql_query和insert into定位存入数据到数据库,接着看有没有数据库查询语句查询存入数据的表,最后看有没有echo输出查询结果。

②可以通过先通过定位echo输出,然后确定查询的那个表,再定位哪个位置插入数据到这个表。

小白将根据这两种设想方法进行存储型XSS的挖掘,可能还有其他方法,鼓励大家分享其他方法。下面我们就以第一个方法为例。

4.2.1审计步骤
4.2.1.1定位存入数据表
mysql_query和insert into可以拆分为多个关键字搜索,为免麻烦mysql_query和insert into一起搜索了。

mysql_query.*?insertinto


发现只有2个文件总共13个匹配结果,出乎意料的少。先判断有没有对即将存入的数据进行过滤,若没有过滤可以借着下一步,若有过滤就ganme over。要判断是否过滤还得进入代码的函数进行审计。




只有两个文件,第一个是包含了网站大部分函数的脚本,我们就选择这个进行审计。

判断是否存在过滤


我们就挑这一段代码进行审计吧,看看是否存在存储型XSS,木有的话就算了,天气太冷了,小白准备躲被窝里抱团取暖了。

双击进入该代码的位置:



可以看到可以控制的传入查询语句的值大部分都调用了test_input函数,顾名思义就是测试输入。

分析test_input函数
我们搜索下test_input函数存在哪个文件(用“test_input\(”关键字搜索):



可以看到该函数存在function.php文件中,从这聊聊几句代码中可以看到先调用了trim函数对传进来的值进行处理。

trim函数作用是移除字符串两侧的空白字符或其他预定义字符。这里应该是去除空白字符。

去除空白字符后接着用stripslashes处理传进来的值,stripslashes() 函数的作用是删除由addslashes() 函数添加的反斜杠。双击进去看test_input函数的全部代码:




去除反斜杠后调用htmlspecialchars函数把预定义的字符转换为 HTML 实体,预定义的字符有&、"、'、<、>。ENT_QUOTES表示编码双引号和单引号。看到htmlspecialchars小白顿时慌了,这不是坑爹嘛~

写一个脚本验证htmlspecialchars处理数值后是否还能执行javascript代码:

test.php


果然是不能弹窗,看下网页源码:


小白顿时想掩面狂奔,不过还是沉下心来自我安慰道:“虽然过滤的,但是审计的流程还是得讲完的。俗话说得好,自己耍的套路,哭着也要耍完。”

4.2.1.4定位查询、输出位置
从上面得知存入数据的表是sc_categories,要查找进行该表查询的关键字可以是(有且不仅限于):

①select.*? sc_categories;

② select \*.*? sc_categories;

③ select \*.*? from sc_categories;-

④ select category_name.*? sc_categories;

⑤ select category_name.*?from sc_categories;

没有最多,只有更多。这5个关键字仅仅是一小部分,大家可以自行发挥。用第一个关键字搜索可以得知有5个文件总共25个匹配结果符合我们的搜索关键字:




随便点入一个匹配结果:




可以得知nlmcc函数会返回分类名,我们接着看哪里调用了nlmcc函数,关键字“nlmcc(”。


可以看到有7个文件总共18个匹配结果匹配我们的关键字,而且搜索结果既有nlmcc函数,也有pnlmcc函数,这两个函数前面都有echo,也就是直接把函数返回值输出到页面上。如果前面没有调用htmlspecialchars函数做文字处理的话就存在存储型XSS了。

验证结果
①添加分类:


②获取分类id值:



鼠标移到编辑那里可以获取到分类id值是101.

③构造链接访问:


查看源码会发现“><script>alert(1)</script><”进行了html编码转换:



如果没有调用htmlspecialchars函数做文字处理的话是不是就存在存储型XSS呢?我们注释掉调用htmlspecialchars函数的代码:


再添加一个分类:


修改后页面就弹出了个提示窗口:


果然是htmlspecialchars函数的问题呢。分类id是102,构造好链接访问试试:



总结

这次小白学习XSS审计虽说后面审计不出存储型XSS,但是至少证明了小白的审计思路是对的。关于htmlspecialchars函数如果写的不对,其实还是有一定可能绕过的。大家也可以了解下htmlspecialchars绕过,到时候记得给大家分享哦!


页: [1]
查看完整版本: 代码审计入门教学(四)