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 |
|