0x01 分析

其实这个洞和ph师傅之前审的那个XSS原理差不多,就是在输出的时候本来存在数据库里的html编码的信息被反解了。
就是common.function.php里的他:
屏幕快照 2019-11-09 下午3.03.16.png
那只要经过这里的html编码就会被反解构成xss。
在输入留言本的时候存在这样一个问题,本来ph师傅那个xss修复加了一个xss过滤过滤函数(common.function.php里的RemoveXSS)。
但是留言写入数据库时的逻辑是这样的。
protect/apps/default/controller/coluymnController.php
屏幕快照 2019-11-09 下午3.07.12.png
整个for循环解析你输入的各个字段,打标两处是过滤,注意第二处扔到html_in里随即会扔到RemoveXSS里。而如果是数组,就会进入第一处,没有扔进RemoveXSS里过滤而是扔进了一个叫deletethtml过滤。然后扔进in里转码(由于输出解码了,可以无视了)。现在就是如何绕过deletehtml屏幕快照 2019-11-09 下午3.10.49.png

这函数就一正则匹配,我们可以用html编码绕过。 既然输出处html解码了, 那我在输入数据库的时候是不是想怎么html编码就怎么编码了?

[11-9] yxcms存储型XSS - 图4

这里师傅用了<script&gt;alert(1)</script&gt;使得正则匹配不上。
屏幕快照 2019-11-09 下午3.35.24.png
写了进来。出的时候就无视了,直接转码XSS。

0x02 总结

这个洞我觉得难点在source点上,这里的参数获取$_POST[$tableinfo[$i]['tableinfo']使得这个地方很难去静态分析代码。需要数据库的信息才知道$_POST取的是哪个参数。
而且这种二次注入结合很巧妙, 看似输入流没有问题,但是输出流解码了。这是个大问题,比如SQL注入时的读数据时的自动转义引号。

0x03 后记

在复现这个洞的时候瞄了一眼426行,咦, 这个可控诶…于是开始折腾.

[11-9] yxcms存储型XSS - 图6
这个地方的业务就是那个登陆提交正确后自动跳转回referer,可控,referer xss。
然而并没有啥用,除非我csrf这个:

  1. 127.0.0.1:8888/yxcms1.4/index.php?r=default/column/index&col=guestbook?'<img src='' onerror='alert()'/>

用户填写表单, 然后跳到这个三秒跳转函数,然而不是js跳的referer会做url转义。屏幕快照 2019-11-09 下午4.01.57.png
听说IE8下可以?