目录
条件竞争
1.1、原理:
在多线程的前提下,文件上传后会先保存到服务端再判断文件是否合规(会有一段时间被保留在服务器中),不合规则删除。如果此时还没判断是否合规,就进行不断的访问,而此时文件刚好存在的话,就达到执行文件的目的。
1.2、示例:
有一个银行账户A和一个银行账户B里面各有10w
现在有两名用户同时登录到了账户A,并且两人都打算:从账户A转1w到账户B
正常的操作结果:账户A剩余8w,账户B剩余12w
但,实际情况是:
(1)用户甲发起转账请求,服务器验证账户A的余额为10w
(2)用户乙同时发起转账请求,服务器验证账户A的余额为10w元
(3)
服务器处理用户甲的请求,从账户A里面扣除1w(此时账户A余额为9w),并将其存入账户B(此时账户B余额为11w)
同时
服务器处理用户乙的请求,从账户A里面扣除1w(此时账户A余额为9w),并将其存入账户B(此时账户B余额为12w)
(5)处理结果:账户A余额为9w,账户B余额为12w
1.3、利用过程:
第一步:创建一个php文件,写入下面语句
<?php
$f= fopen ("test.php","w") ;
fputs ($f,'<?php phpinfo();?>');
?>
访问到这个文件后,这个文件会在服务器的当前目录下创建一个test.php的,内容为<?php phpinfo();?>。
第二步:设置burpsuite代理
(注:我的burpsuite拦截不到本地上传啥的,只能拦截到真实网络中,就拿真实网络为个例子)
第三步:进行上传,并用surprise拦截,并把拦截到的数据包发送到Intruder模块
第三步:在报文头后加&a=1,将1选中,点击add(那个符号)
第四步:新建页面,访问1.php这个文件(营造1000人访问这个文件)
(先dorp(放掉)前面拦截的流量)
将拦截到的访问1.php流量发送到Intruder模块
在报文头后加?a=1并将1选中添加符号
(这里和上面一步的操作一样)
第五步:配置Intruder(测试器)模块
点击Payloads(有效载荷),类型选择Numbers(数值),在下面设置数值范围
(就会对前面?a=1,对这里的1进行不断的修改,在数值范围内修改)
营造1000人访问的场景
可以点击将一个访问发送多次到Intruder模块,实现更多的访问
并将每一个的线程调高,点击Options(选项)---->增加线程
设置就算完成了
第六步:点击Start attack(开始攻击)
查看results(结果)时
相应包里出现200,就是访问成功
查看服务器目录,创建test.php文件,成功执行了
第七步:访问test.php文件,执行相关操作