CTF-Web-技巧积累

其他

什么是 Webpack

Webpack是一个现代的 JavaScript 应用程序的静态模块打包工具。它主要用于将项目中的各种模块(如 JavaScript、CSS、图片等)打包成最终的静态资源文件,以供在浏览器中加载和执行.

常见备份文件名

1
.git .svn .swp .svn .~ .bak .bash_history

在开发者工具中修改 html

在开发者工具的 inspecter 中可直接修改 html.

每个 Cookie 都是由一个键值对组成的:

1
CookieName1=CookieValue1; CookieName2=CookieValue2; ...

Cookie 的名称是区分大小写的,而值可以是任意字符,但在值中不能包含分号、逗号或其他特殊字符,如果有需要,可以使用URL编码进行转义。

在 HTTP 请求头中的格式为:

1
Cookie: CookieName1=CookieValue1; CookieName2=CookieValue2

Perl, UserAgent 模块用 get 提交一个变量

1
2
my $url = 'http://61.147.171.105:65020?a=1';
my $response = $ua->get($url);

Perl, UserAgent 模块用 post 提交一个变量

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
use LWP::UserAgent;
use HTTP::Request::Common;

my $ua = LWP::UserAgent->new;

## 构建请求URL
my $url = 'https://example.com/api';

## 构建变量参数
my %params = (
var1 => 'value1',
var2 => 'value2'
);

## 发送 POST 请求
my $response = $ua->post($url, \%params);

## 检查请求是否成功
if ($response->is_success) {
my $content = $response->content;
## 处理响应内容
print "Response: $content\n";
}
else {
print "Error: " . $response->status_line . "\n";
}

Perl 的 Hash

注意是 () 而不是 {}

观察 url

注意观察 url, 有时信息藏在 url 中, 如这道题, 有用页面的 url 为:

1
http://61.147.171.105:57407/index.php?id=1

可尝试修改 id 的值, 这里可用脚本爆破.

Perl 匹配时包含换行符以及匹配空行

添加 /s 标志即可让元字符匹配换行符.

匹配空行用 ^(\s*)$.

对一个多行的字符串多次应用正则表达式用 \m 标志.

常用的一种正则表达式句型为:

1
my ($want) = $response->content =~ s!<\!DOCTYPE html>.*?</html>:?!!irs;

Perl 刷新缓冲区

1
STDOUT->flush();

robots.txt

一般都存在 robots.txt 文件.

关于 .user.ini 文件

这个文件是php.ini的补充文件,当网页访问的时候就会自动查看当前目录下是否有.user.ini,然后将其补充进php.ini,并作为cgi的启动项.

  1. 位置和命名:.user.ini 文件需要放置在你希望应用特定配置的目录中。它的文件名必须以 .user.ini 结尾,并且以点开头。

  2. 配置选项:.user.ini 文件可以包含一系列 PHP 配置选项,以及它们的值。你可以在该文件中指定与应用程序相关的 PHP 配置,例如 memory_limit、max_execution_time、display_errors 等。

  3. 优先级:.user.ini 文件的配置选项会覆盖全局的 PHP 配置,但会被更具体的配置选项所覆盖。例如,如果在 .user.ini 文件中设置了 memory_limit 为 256M,但在全局配置中设置为 512M,那么实际生效的值将是 256M。

  4. 访问限制:默认情况下,.user.ini 文件的访问权限是受限的。它只能被与该文件所在目录属于同一用户或用户组的脚本所读取。这有助于确保其他用户无法读取敏感的 PHP 配置信息。

PHP 代码审计

PHP 中的 @ 符号的含义

在PHP中,@符号是一个错误控制运算符。在特定的表达式前面加上@符号,可以抑制该表达式产生的错误或警告信息的显示.

如何用 PHP 调用 SHELL 指令

1
2
3
4
5
6
7
<?php
$command = 'ls -l'; // 要执行的 Shell 命令

$output = shell_exec($command); // 调用 Shell 命令并获取输出

echo "<pre>$output</pre>"; // 将输出打印到页面上
?>

unserialize 函数

unserialize 函数调用前, 会先检查是否存在 __wakeup() 函数并执行.

php 中的 intval 函数

其将给定值转换为整数, 如将字符串转换为整数:

1
2
3
4
5
6
7
8
9
10
11
$num1 = "123";
$result1 = intval($num1);
echo $result1; // 输出: 123

$num2 = "456.78";
$result2 = intval($num2);
echo $result2; // 输出: 456

$num3 = "FF"; // 十六进制值
$result3 = intval($num3, 16);
echo $result3; // 输出: 255

绕过长度限制

在低版本的 php 中科学记数法的长度是按照字符串来算的.

匹配哈希值, 哈希碰撞

暴力破解:

1
2
3
4
5
6
7
8
$b = 0
while (1) {
if ('8b184b' === substr(md5($b), -6, 6)) {
echo $b;
break;
}
$b++;
}

在 url 中传入 json 数据

如:

1
https://example.com?c={"m":"2023c", "n":[[], 0]}

弱类型语言比较的特点

数字与字符串比较的时候会自动进行解析, 其会将字符串从第一个非数字处阶段, 将截断前的字符串当作数字进行比较.

PHP 中的 array_search 函数

array_search() 函数用于在数组中搜索给定的值,并返回对应的键(即数组元素的索引)。它可以用于查找特定值在数组中的位置。

如:

1
2
3
$fruits = array('apple', 'banana', 'orange', 'grape');
$key = array_search('orange', $fruits);
echo $key; // 输出: 2

绕过 array_search 函数

其查找元素是用的是 == 而不是 ===, 因此 字符串==0 成立.

?a=1E9&b=53724&c={“m”:”2023c”, “n”:[[],0]}

关于 index.phps

其不是人工编写并存放在服务器中的, 而是由服务器生成的.

.phps 文件是一种以 .phps 为扩展名的文件类型。它是一种特殊的 PHP 文件,其中的 PHP 代码会被解析和显示为纯文本,而不会被执行。这在某些情况下可以用来共享 PHP 代码的源代码,而不会直接执行其中的代码。

当一个服务器上的 .phps 文件被请求时,服务器会将文件内容以纯文本形式发送给客户端,而不会执行其中的 PHP 代码。这样,客户端可以查看 PHP 文件的代码,包括变量、函数和逻辑结构,而不会看到 PHP 脚本的实际执行结果。

服务器接收到对一个普通的 .php 文件的请求时,如果服务器配置了相应的选项,它可以自动将该文件转换为 .phps 文件并发送给客户端。

关于 php 中 $_GET[id]$ 符号

在 PHP 中,$_GET['id'] 是一个超级全局变量,用于获取通过 GET 方法传递的 URL 参数中名为 “id” 的值。

当通过 GET 方法向服务器发送请求时,可以在 URL 中附加参数。例如,URL 可能如下所示:

1
http://example.com/page.php?id=123

在这个 URL 中,参数 “id” 的值是 “123”。要在 PHP 中获取该值,可以使用 $_GET[‘id’]。具体来说,$_GET 是一个关联数组,其中包含通过 GET 方法传递的所有参数和它们的值。通过指定参数名称作为数组键,可以访问特定参数的值。

在上述示例中,可以使用以下代码获取 “id” 参数的值:

1
$id = $_GET['id'];

在 PHP 中,符号 “$” 用于表示变量。

当在 PHP 中声明变量时,需要在变量名前加上 “$” 符号。例如:

1
$name = 'John';

urldecode() 函数

urldecode() 函数用于解码 URL 编码的字符串.

在 URL 编码中,特殊字符被表示为 “%” 后跟两个十六进制数字 (ASCII 码),例如 “%20” 表示空格。

urldecode() 函数接受一个 URL 编码的字符串作为参数,并返回解码后的原始字符串。它会将 URL 编码字符串中的特殊字符转换回其原始形式。

1
2
3
4
$encodedString = 'Hello%20World%21';
$decodedString = urldecode($encodedString);

echo $decodedString; // 输出:Hello World!

需要注意的是当我们在浏览器输入admin时,浏览器会对admin进行一次url解码,所以需要对admin进行两次url编码才可.

类型比较

php中有两种比较符号

=== 会同时比较字符串的值和类型

== 会先将字符串换成相同类型,再作比较,属于弱类型比较

php中的弱类型比较会使’abc’ == 0为真

is_numeric() 函数会判断如果是数字和数字字符串则返回 TRUE,否则返回 FALSE,且php中弱类型比较时,会使(‘1234a’ == 1234)为真

什么是 php://filter

其可用于读写操作, 是 PHP 中的一种特殊流(stream)类型. 可以对输入和输出数据进行过滤和处理.

如读取服务器上的文件:

1
2
3
4
5
$file = fopen('php://filter/read=convert.base64-encode/resource=file.txt', 'r');
while (!feof($file)) {
echo fgets($file);
}
fclose($file);

向服务器上的文件写入:

1
2
3
4
$data = 'Hello, world!';
$file = fopen('php://filter/write=convert.base64-decode/resource=output.txt', 'w');
fwrite($file, $data);
fclose($file);

其中 convert.base64-encode 过滤器用于对数据进行 Base64 编码.

php 中以下划线开头的变量

以下划线(_)开头的变量通常有特殊的含义和用途, 如 $_, $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER

类似 FILE 变量

在 PHP 中,FILE 是一个魔术常量,用于获取当前文件的完整路径和文件名。它返回包含当前文件的绝对路径和文件名的字符串。

还有 __DIR__ 变量返回目录路径.

什么是 php 的伪协议

php://input 的值就是 POST 传入的值.

POST 传送数据以及传递参数

PHP 中的 highlight_file() 函数

highlight_file() 函数用于将指定文件的源代码以语法高亮的形式输出到浏览器或作为字符串返回。

如:

1
highlight_file('path/to/file.php');

关于 __wakeup() 漏洞

当传入的序列化字符串对象的属性个数的值大于真实个数时就会跳过 __wakeup 的执行.

如将:

1
O:4:"xctf":1:{s:4:"flag";s:3:"111";}

中的 1 修改为 2:

1
O:4:"xctf":2:{s:4:"flag";s:3:"111";}

SQL 注入

基本的 SQL 注入方法

对于 SQL 注入, 首先尝试:

  • ' or ''='
  • ' or 1=1 --+

使用 sqlmap 则为:

1
sqlmap -u ‘http://61.147.171.105:51922/?id=1’ -D cyber -T cyber -C user,Id,pw --dump

CTF-Web-技巧积累
http://example.com/2023/08/13/CTF-Web-技巧积累/
作者
Jie
发布于
2023年8月13日
许可协议