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 ...
随机推荐
- js给多级复杂动态变量赋值
1 function SetVal(field, val) { 2 var arr = field.split("."); 3 var str = arr[0]; 4 if (wi ...
- 深入探讨HBASE
HBASE基础 1. HBase简介HBase是一个高可靠.高性能.面向列的,主要用于海量结构化和半结构化数据存储的分布式key-value存储系统. 它基于Google Bigtable开源实现,但 ...
- [leetcode/lintcode 题解] 微软 面试题:实现 Trie(前缀树)
实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法. 在线评测地址:领扣题库官网 样例 1: 输入: insert(" ...
- 极客mysql02
mysql 一条更新语句的执行过程: 1.首先客户端通过tcp/ip发送一条sql语句到server层的SQL interface 2.SQL interface接到该请求后,先对该条语句进行解析,验 ...
- Java的注释-标识符和关键字
1.Java注释 单行注释 多行注释 文档注释 代码示例 public class Hello{ public static void main(String[] args) { ...
- Python_Tips
Python绝对路径与相对路径读写文件[上级目录: os.path.dirname(os.getcwd())] # coding:utf8 ''' 知识点:Python读写文件时候的相对路径与绝对路径 ...
- React native路由跳转navigate、push、replace的区别
由于没有系统的去学习RN,对路由跳转了解不多,只是跟着项目在做,抽点时间简单学习一下RN路由跳转方法区别,总结如下: 如上图,外部是一个栈容器,此时A页面在最底部,navigate到B页面,为什么此时 ...
- 利用Vmware workstation安装MS-DOS使用Turbo C 2.0
首先上各种软件的链接 链接:https://pan.baidu.com/s/1HfTDexiJSpioUnzKddUIyA 提取码:khtu 这个链接是压缩后的 链接:https://pan.baid ...
- 死磕以太坊源码分析之Kademlia算法
死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...
- Docker学习第二天(Docker容器管理)
简介 emmmm Docker 容器管理 推荐文章:容器技术概述 run里面的子选项 1.使用run命令创建容器 docker container run -it ubuntu /bin/bash / ...