PHP代码审计分段讲解(3)
05 ereg正则%00截断
放上源代码
<?php $flag = "flag"; if (isset ($_GET['password']))
{
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
查看代码流程,使用GET方式传入password,然后使用ereg函数进行正则匹配
关于ereg函数有:
以区分大小写的方式在
string中寻找与给定的正则表达式pattern所匹配的子串。如果找到与
pattern中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数regs,则匹配项将被存入regs数组中。$regs[1] 包含第一个左圆括号开始的子串,$regs[2] 包含第二个子串,以此类推。$regs[0] 包含整个匹配的字符串。
然而ereg函数是一个存在缺陷的函数,现在大都使用preg_match函数对其替换,其缺陷在于:当ereg()函数碰到%00的时候,就会认为字符串结束了,并不会继续向下检测,另外当其碰到数组的时候返回为NULL
接着是:
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
需要password长度小于8并且大于9999999,这个可以直接使用科学计数法绕过,即1e9这种
获取flag需要满足:
if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
即在password里面能够找到字符串
*-*
想要找到该字符串,就需要突破第一个if的限制,这里我们使用到的就是%00截断
最终的payload为:
?password=1e9%00*-*
成功获取flag
06 strcmp比较字符串
源代码为:
<?php
$flag = "flag";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。 //比较两个字符串(区分大小写)
die('Flag: '.$flag);
else
print 'No';
} ?>
这里需要我们以GET方式传入a,并且比较a和$flag是否相等,相等则输出flag
这个逻辑看似是锁死了我们的路,我们想要知道flag才来做题,但是做这个题获取flag需要已知flag :D
查看代码,可以看到比较两者大小使用的是strcmp函数,而该函数是存在漏洞的
关于strcmp函数
定义和用法
strcmp() 函数比较两个字符串。
注释:strcmp() 函数是二进制安全的,且对大小写敏感。
该函数比较两个字符串,而要是我们传入的不是字符串呢?
输入非字符串的时候,函数会出现报错,但是函数返回0,也就是说,虽然函数报错了,但是判断结果却是相等
所以最后的payload为
?a[]=1
07 sha()函数比较绕过
源代码为
<?php $flag = "flag"; if (isset($_GET['name']) and isset($_GET['password']))
{
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else
echo '<p>Login first!</p>';
?>
可以看到我们需要使用GET方式传入name和password
关于name和password需要满足:
$_GET['name'] != $_GET['password']
sha1($_GET['name']) === sha1($_GET['password'])
即name和password的值不等,但经过sha1加密之后的值相等
这里我们也使用数组来进行绕过,因为sha1()函数不能处理数组类型,将报错并返回NULL,条件成立,输出flag
最后的payload为:
?name[]=1&password[]=2
PHP代码审计分段讲解(3)的更多相关文章
- PHP代码审计分段讲解(14)
30题利用提交数组绕过逻辑 本篇博客是PHP代码审计分段讲解系列题解的最后一篇,对于我这个懒癌患者来说,很多事情知易行难,坚持下去,继续学习和提高自己. 源码如下: <?php $role = ...
- PHP代码审计分段讲解(13)
代码审计分段讲解之29题,代码如下: <?php require("config.php"); $table = $_GET['table']?$_GET['table']: ...
- PHP代码审计分段讲解(11)
后面的题目相对于之前的题目难度稍微提升了一些,所以对每道题进行单独的分析 27题 <?php if(!$_GET['id']) { header('Location: index.php?id= ...
- PHP代码审计分段讲解(1)
PHP源码来自:https://github.com/bowu678/php_bugs 快乐的暑期学习生活+1 01 extract变量覆盖 <?php $flag='xxx'; extract ...
- PHP代码审计分段讲解(12)
28题 <!DOCTYPE html> <html> <head> <title>Web 350</title> <style typ ...
- PHP代码审计分段讲解(10)
26 unserialize()序列化 <!-- 题目:http://web.jarvisoj.com:32768 --> <!-- index.php --> <?ph ...
- PHP代码审计分段讲解(9)
22 弱类型整数大小比较绕过 <?php error_reporting(0); $flag = "flag{test}"; $temp = $_GET['password' ...
- PHP代码审计分段讲解(8)
20 十六进制与数字比较 源代码为: <?php error_reporting(0); function noother_says_correct($temp) { $flag = 'flag ...
- PHP代码审计分段讲解(7)
17 密码md5比较绕过 <?php if($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ': ...
- PHP代码审计分段讲解(6)
14 intval函数四舍五入 <?php if($_GET[id]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_M ...
随机推荐
- ashx接收前台传来的数据
前台js: $(function () { $.ajax({ url: "/TestAshx/GetJson.ashx", type: "post", data ...
- 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM内核下
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(1)之执行在不同CM内核下. 文接上篇 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计&g ...
- spring 中aop 切面实战
切面相关注解: @Aspect : 声明该类为一个注解类 @Pointcut : 定义一个切点 @Before : 在切点之前执行 @After : 在切点之后执行 不管目标方法是否执行成功 @Aft ...
- 强迫自己学习Jquery三
元素定位问题 offset 和 position必须要好好看一下,
- [MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索
一.图 在正式进入广度优先搜索的学习前,先了解下图: 图分为有向图和无向图,由点vertices和边edges构成.图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和 ...
- Vue + WebRTC 实现音视频直播(附自定义播放器样式)
1. 什么是WebRTC 1.1 WebRTC简介 WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频 ...
- tcp syn-synack-ack 服务端接收ack
TCP 服务端 接收到ack tcp_v4_rcv() -> tcp_v4_do_rcv() -> tcp_v4_hnd_req() + tcp_child_process()tcp_v4 ...
- UNP——第五章,TCP客户/服务程序
tcpser void str_echo(int sockfd) { long arg1, arg2; ssize_t n; char line[MAXLINE]; for ( ; ; ) { if ...
- python读取excel数据转换成字典
以上面的excel格式,输出字典类型: import xlrddef read_excel_data(): filename = 'E:\学历列表.xls' data = xlrd.open_work ...
- mysql之分区表
1.分区表概述: 1.分区表的主要意义在于,对于表结构进行划分,不同的数据进入不同的分区中,以便于在查询过程中,只查找指定分区的数据,减少数据库扫描的数据量. 2.虽然从逻辑上看分区表是一张表,但是底 ...