HTTP请求方法
- GET : 提交内容明文显示在URL中,请求页面信息并返回实体。
- POST : 请求内容隐藏在请求正文中,请求页面信息并返回实体。
- HEAD : 类似于GET,用于测试网页服务,返回无具体内容。
- OPTIONS : 用于获取当前网站所允许的请求方法
- TRACE : 回显服务器收到的请求,用于测试网站。
- PUT : 向服务器上传文件
- DELETE : 请求服务器删除文件
- MOVE : 请求服务器将指定文件移动到另一个地方
- COPY : 请求服务器将指定文件拷贝到另一个地方
HTTP消息报头
- Accept : 指定客户端接收内容的类型
- Accept-charset : 浏览器可以接受的字符集
- Accept-Encoding : 浏览器可以接受的压缩编码类型
- Accept-Language : 浏览器可以接受的语言
- Connection : 是否长连接(HTTP/1.1 默认是 ) - 开启 Connection: keep-alive
- 关闭 Connection: close
 
- Cookie : 浏览器将该域名下的Cookie发送给服务器
- Content-Length : 请求内容长度。构造POST数据包。
- content-type: 请求内容类型。最常见:  application/x-www-form-urlencoded用于构造POST数据包。- enctype规定在提交表单时的编码方式,有3种
- application/x-www-form-urlencoded : 默认。
- multipart/form-data : 指定传输数据类型为 二进制类型。类似图片、MP3。。
- text/plain : 纯文本传输,即以ASCII编码传输。空格转换为+。
 
- Host : 请求服务器的域名(IP)和端口号(默认8080可省略)。
- Referer : 标识从哪个页面跳转过来的
- User-Agent : 用户信息(系统版本 浏览器版本等)
- X-Forwarding-For 或 Client-ip : 用于标识用户真实IP
HTTP状态码
- 1XX : 请求已接收,正在处理 
- 2XX : 正常响应 
- 3XX : 请求正常,但重定向 - 302 : 请求资源存在,但服务器引导用户向其他URL请求资源
 
- 4XX : 客户端请求错误 - 400 : 请求语法错误
- 403 : 拒绝提供服务,权限限制
- 404 : 请求资源不存在
- 405 : 请求方式不合法,请求方式不被允许
 
- 5XX : 服务器错误 - 500 : 服务器发生不可预期错误
- 503 : 服务器当前无法处理请求
 
Mysql数据库
数据库、数据表、字段还有记录(列)

MYSQL语句
- 增
insert into 表名 (字段名称1,字段名称2) value (值1,值2)
- 删
delete from 表名 where id=1
- 改
update 表名 set 字段名1=值1 where id=1
- 查
select * from 表名
select 列名 from 表名
select * from 表名 order by id // 默认升序 。此处以id升序排序
select * from 表名 like '%模糊词%' // 查询中间带模糊词的
select * from 表名 where id>2
select * from 表名 limit 0,1 //只显示1条 [0,1)区间内的字段
- And 和 Or 运算符
and的优先级大于or。即先进行and运算,再进行or运算。
搭建测试环境
- CREATE DATABASE test;创建数据库
- USE test;使用数据库
- CREATE TABLE user(username varchar(30),password varchar(30));创建表
- INSERT INTO user(username,password) values('admin','passwd');插入数据
- DROP TABLE user删除表
- DROP DATABASE test删除数据库
- UPDATE user SET password='root' where username='admin'更新表中的记录
- DELETE FROM user where username='admin'删除表中记录
- ALTER TABLE user ADD lasttime TIME增加字段
- ALTER TABLE user DROP lasttime删除字段
注入攻击
简介: 构造数据库执行语句进行对数据库的操作。下面以常见的Mysql注入作为介绍。
万能密码
原理: 通过输入账号密码构造sql注入语句,达到绕过登录的目的。
假设服务器使用的查询语句为: select * from admin where username='admin' and password='thisismypw';
①在用户名已知的情况下:
- select * from admin where username=’admin’ or ‘1’=’1‘ and password=’thisismypw’;
- select * from admin where username=’admin’#‘ and password=’thisismypw’; //只会返回username=’admin’的记录
②在用户名未知的情况下:
- select * from admin where username=’1’ or 1 or ‘1‘ and password=’thisismypw’; //该命令会返回表所有记录
联合查询
简介: Union联合查询用于合并多个select语句结果
注意: Union内部select语句的列数要与外部select相同。
例
异或注入
MYSQL注入语句
- select group_concat(table_name) from information_schema.tables where table_schema=database()//查询当前数据库的所有表
- select group_concat(column_name) from information_schema.columns where table_schema.columns=TABLE_NAME//查看当前表中的字段
- select group_concat(COLUMN_NAME) from TABLE_NAME//查看字段中的记录
上传漏洞
常见五种上传检测方式:
1、客户端javascript检测
2、服务端MIME类型检测(数据包中content-type内容)
3、服务端目录路径检测(检测 path 参数)
4、服务端文件扩展名检测
5、服务端文件内容检测。
1、javascript检测绕过:
①判断JS本地验证。通过Burp抓包,当数据包未发送时,本地弹框,则为JS检测。
②绕过: 上传正常jpg格式,通过Burp抓包改包;使用检查元素修改HTML代码。
2、MIME类型检测绕过:
1、Burp抓包 修改图片数据中的 content-type 内容。一般改为 image/gif ;或上传正常jpg格式,修改数据包中的后缀。
2、还有通过表单上传的话 请求报头中的 content-type: multipart/form-data 也会通过表单检测文件类型。解决方法: 将 multipart/form-data 改为大写即可。
3、文件扩展名检测绕过:
①黑名单检测:
- 大小写绕过。 - 名单列表绕过。
- 特殊文件名绕过。 xx.asp_ 在WINDOWS中会自动去除_。在LINUX中不适用。
- 0x00截断绕过。xx.asp%00.jpg %00 复制之后 ctrl+shift+u- PHP别名绕过。php2、php3、php4、php5、phps、pht、phtm、phtml
 
 
②白名单检测:
- 0x00截断绕过。
- 解析调用绕过。配合上传一个代码注入过的白名单文件。
- 双扩展文件名绕过。 1.jpg.php
4、双文件上传绕过:
- 使用Burp抓包,到Repeater中修改数据包。
- 从——WebKitFormBoundaryJyQaD31BFy7f6JAC 开始复制到 图片结束。修改第二段数据的name和filename
5、文件包含
- HTML标签 <script language=php> 一句话木马 </script>
6、文件内容检测绕过:
- 图片马。
7、htaccess重写解析绕过
方法:将代码AddType application/x-httpd-php .jpg保存为.htaccess文件,上传到服务器,再上传一张.jpg格式的图片马,用c刀或菜刀连接即可。
原理: 将.jpg格式的文件以php格式来解析
8、修改文件上传路径(当前目录权限低):
①上传 ../1.asp 可以上传到当前目录的上一级目录。
②利用Burp抓包修改Filepath。PS:通过filepath修改文件名称 /xx.asp;.jpg
弱类型比较
原因: PHP类型比较存在松散比较(==)和严格比较(===)的区别。
原理:
- 松散比较: 类型强制转换之后比较值。字符串转为数值四种情形:- 纯字符串。例如 admin =》 0
- 以合法数值开头的字符串。例如 123admin =》 123
- 科学记数法型的字符串。例如 1e2 =》 100
- 0x开头的字符串。例如 0x10 =》16
 
 ②严格比较: 比较类型和值。
实例: BugKu 矛盾

分析: 简单的PHP弱类型利用。大致代码意思是要求num不能是数值的前提下num要等于1才能够显示flag。
构造Payload: index1.php?num=1a
PS: PHP弱类型利用还有 MD5\HASH绕过、json绕过、array_search is_array、strcmp绕过 php 5.3 、Switch绕过、DeDe任意用户密码重置、in_array()、is_number()
PHP伪协议
PHP://filter 封装协议
简介: 用于数据流打开时的筛选过滤应用。作用在类似 readfile()、file()、file_get_contents()等文件函数。
语法: php://filter/<action>=<name>
可选参数:
- read : 读。 多个过滤器使用管道符 | 分割。可选值:- convert.base64-encode : 将数据流编码为base64
- convert.base64-decode : 将数据流解码为base64
- string.strip_tags : 清除数据流中的html标签。可以去除<?php exit;?>导致的一句话木马无法执行。
- string.toupper : 转换为大写
- string.tolower : 转换为小写
 
- write : 写。可选值:
- resource : 要过滤的数据流。

分析: 一眼看到file=,想到任意文件读写。利用php://filter封装处理数据流将index.php编码为base64后输出(若不进行编码,则会被解析运行)。
构造payload:
file=php://filter/read=convert.base64-encode/resource=index.php

利用notepad++的base64解码功能,即可得到 index.php 的源代码。

函数解释:
- strstr($file,”../“) : 在file字符串中的查找 ../ 。 区分大小写
- stristr($file,”tp”) : 类似strstr,不区分大小写。
PHP://input
简介: 可以访问请求的原始数据的只读流。获取POST请求中的正文。
前提: 开启 allow_url_include 且 当 enctype="multipart/form-data" 时无效。
PHP黑魔法
参考: PHP函数黑魔法小总结
MD5()、SHA1()
PHP中MD5、SHA1无法处理数组,当传入参数为数组时返回NULL。
结合弱类型比较产生MD5碰撞漏洞。v1!=v2 && md5(v1)==md5(v2) 此时传入v1数组v2数组形式即可。v1[]=1&v2[]=2 保证v1!=v2。
相同MD5但不同真值: 240610708 和 QNKCDZO
转换
php自动转换16进制和科学记数法等
| 1 | 
 | 

| 1 | 
 | 

intval()
将字符串开始转换直到遇到非数字字符。若字符串无法转换则返回0。
注: 科学记数法字符串若E后面的数值小于某个值则会转为double,若强制转换为int则可以使值为0。
例: 变量 1e-1000 可以使得变量 既大于0又不大于0。
| 1 | 
 | 

strcmp()
由于当str1和str2相等时返回0。当传入str1或str2为数组时 NULL==0 又是松散比较,所以最后strcmp()返回0。
| 1 | 
 | 

ereg(str1,str2)
存在空字符截断漏洞。当读取str1或str2遇到空字符时,则结束后面的匹配。
注: URL中的空字符为 %00 。
| 1 | 
 | 

is_numeric($a)
当出现 is_numeric($a) and is_numeric($b)时,第二个is_numeric可以绕过检测。
| 1 | $is_numeric1 = '01234'; | 

PS: 当$a为+.123和-.1234时返回也为true。
json_decode()
SQL约束攻击
简介: 当新用户尝试注册时检测数据库中是否已经存在用户。若已存在则不让注册。
利用:通过注册管理员用户从而取得管理员权限。
攻击原理: SQL处理字符串时会将空格符删除。SQL检索数据库返回第一个数据记录。
例如select * from users where username='admin   ';与select * from users where username='admin'效果一致。 类似的还有 insert into users values('user   ','pass    ');
攻击复现 :

select  * from users where username='user      ';
PS: 执行select查询时 不会将字符串缩短为 定义表时的varchar(5)长度。

insert into users value('test           ','admin            ');
PS: 当字符串超过 varchar(5)定义的长度时,则截断插入。

参考:基于约束的SQL攻击
反序列化
函数: serialize() \ unserialize() : 用于序列化(解序列化)对象或数组,返回字符串
| 1 | 
 | 
1
O:object对象 6:对象名称长度 "类名" 1:属性数量 {}:分别代表--s:string 1:属性名长度 "属性名" s:属性值类型 5:属性值长度 "属性值内容"
| 1 | 
 |