web

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

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运算。

搭建测试环境

  1. CREATE DATABASE test; 创建数据库
  2. USE test; 使用数据库
  3. CREATE TABLE user(username varchar(30),password varchar(30)); 创建表
  4. INSERT INTO user(username,password) values('admin','passwd'); 插入数据
  5. DROP TABLE user 删除表
  6. DROP DATABASE test 删除数据库
  7. UPDATE user SET password='root' where username='admin' 更新表中的记录
  8. DELETE FROM user where username='admin' 删除表中记录
  9. ALTER TABLE user ADD lasttime TIME 增加字段
  10. ALTER TABLE user DROP lasttime 删除字段

注入攻击

简介: 构造数据库执行语句进行对数据库的操作。下面以常见的Mysql注入作为介绍。

万能密码

原理: 通过输入账号密码构造sql注入语句,达到绕过登录的目的。

假设服务器使用的查询语句为: select * from admin where username='admin' and password='thisismypw';

①在用户名已知的情况下:

  1. select * from admin where username=’admin’ or ‘1’=’1‘ and password=’thisismypw’;
  2. select * from admin where username=’admin’#‘ and password=’thisismypw’; //只会返回username=’admin’的记录

②在用户名未知的情况下:

  1. select * from admin where username=’1’ or 1 or ‘1‘ and password=’thisismypw’; //该命令会返回表所有记录

联合查询

简介: Union联合查询用于合并多个select语句结果

注意: Union内部select语句的列数要与外部select相同。

mysql1

异或注入

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、文件扩展名检测绕过:

①黑名单检测:

  1. 大小写绕过。

    1. 名单列表绕过。
    2. 特殊文件名绕过。 xx.asp_ 在WINDOWS中会自动去除_。在LINUX中不适用。
    3. 0x00截断绕过。xx.asp%00.jpg %00 复制之后 ctrl+shift+u
      1. PHP别名绕过。php2、php3、php4、php5、phps、pht、phtm、phtml

②白名单检测:

  1. 0x00截断绕过。
  2. 解析调用绕过。配合上传一个代码注入过的白名单文件。
  3. 双扩展文件名绕过。 1.jpg.php

4、双文件上传绕过:

  1. 使用Burp抓包,到Repeater中修改数据包。
  2. 从——WebKitFormBoundaryJyQaD31BFy7f6JAC 开始复制到 图片结束。修改第二段数据的name和filename

5、文件包含

  1. HTML标签 <script language=php> 一句话木马 </script>

6、文件内容检测绕过:

  1. 图片马。

7、htaccess重写解析绕过

方法:将代码AddType application/x-httpd-php .jpg保存为.htaccess文件,上传到服务器,再上传一张.jpg格式的图片马,用c刀或菜刀连接即可。

原理: 将.jpg格式的文件以php格式来解析

8、修改文件上传路径(当前目录权限低):

①上传 ../1.asp 可以上传到当前目录的上一级目录。

②利用Burp抓包修改Filepath。PS:通过filepath修改文件名称 /xx.asp;.jpg

弱类型比较

原因: PHP类型比较存在松散比较(==)和严格比较(===)的区别。

原理:

  1. 松散比较: 类型强制转换之后比较值。字符串转为数值四种情形:
    1. 纯字符串。例如 admin =》 0
    2. 以合法数值开头的字符串。例如 123admin =》 123
    3. 科学记数法型的字符串。例如 1e2 =》 100
    4. 0x开头的字符串。例如 0x10 =》16

​ ②严格比较: 比较类型和值。

实例: BugKu 矛盾

bugku1

分析: 简单的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 : 要过滤的数据流。

例: Bugku flag在index里

file

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

构造payload:

file=php://filter/read=convert.base64-encode/resource=index.php

phpfilter

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

notepad

函数解释:

  • 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但不同真值: 240610708QNKCDZO

转换

php自动转换16进制和科学记数法等

1
2
3
4
<?php
$a = 0x208;
echo $a;
?>

hex

1
2
3
4
<?PHP
$a = 5.2e2;
echo $a;
?>

hex

intval()

将字符串开始转换直到遇到非数字字符。若字符串无法转换则返回0。

注: 科学记数法字符串若E后面的数值小于某个值则会转为double,若强制转换为int则可以使值为0。

例: 变量 1e-1000 可以使得变量 既大于0又不大于0

1
2
3
4
<?PHP
var_dump((int)'1e-1000'>0);
var_dump('1e-1000'>0);
?>

intval

strcmp()

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

1
2
3
4
5
6
<?php
$str1[]='1';
if(!@strcmp($str1,'ssssss'))
echo 'yes';
# 在函数前加'@'可以屏蔽错误信息
?>

strcmp

ereg(str1,str2)

存在空字符截断漏洞。当读取str1或str2遇到空字符时,则结束后面的匹配。

注: URL中的空字符为 %00 。

1
2
3
4
5
<?PHP
$b = $_GET["b"];
#$b = urldecode($_GET["b"]);
var_dump(@eregi("111".substr($b,0,1),"1114"));
?>

ereg

is_numeric($a)

当出现 is_numeric($a) and is_numeric($b)时,第二个is_numeric可以绕过检测。

1
2
3
4
5
6
$is_numeric1 = '01234';
$is_numeric2 = 'abc';
$c = is_numeric($is_numeric1) and is_numeric($is_numeric2);
if($c){
var_dump(is_numeric($is_numeric2));
}

isnumeric

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 ');

攻击复现 :

sql

select * from users where username='user ';

PS: 执行select查询时 不会将字符串缩短为 定义表时的varchar(5)长度。

insert into users value('test ','admin ');

PS: 当字符串超过 varchar(5)定义的长度时,则截断插入。

sql2

参考:基于约束的SQL攻击

反序列化

函数: serialize() \ unserialize() : 用于序列化(解序列化)对象或数组,返回字符串

1
2
3
4
5
6
7
8
<?php 
$KEY="I am string";
$s = serialize($KEY);
echo $s; # s:11:"I am string";
?>
​```参数简介
s:string类型 11:字符串长度 "字符串内容"

1
O:object对象 6:对象名称长度 "类名" 1:属性数量 {}:分别代表--s:string 1:属性名长度 "属性名" s:属性值类型 5:属性值长度 "属性值内容"

1
2
3
4
5
6
7
8
9
10
11
12

原理: unserialize()参数可控,注入payload触发对象中的魔术方法。

魔术方法:

* _construct(): 当对象**创建**时自动调用。注意 unserialize() 解序列时不会自动调用。
* _destruct(): 当对象**销毁**时自动调用。
* _wakeup(): 当 unserialize() **解序列**后 自动调用。
* _toString(): 当一个对象被**当做字符串**使用时调用
* _sleep(): 在对象被**序列化**之前调用
* _invoke(): 尝试以**调用函数的方式**调用一个对象时,自动调用。
* _get(): 当**访问**一个类中**不存在的属性**时调用。

本文标题:web

文章作者:Tanker

发布时间:2019年11月03日 - 09:55

最后更新:2020年01月04日 - 10:23

原始链接:https://www5059109.github.io/2019/11/03/web/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%