zoukankan      html  css  js  c++  java
  • PHP-Audit-Labs-Day1学习

    前言

    这个项目很久就看到了,一直没认真学习。这几天被角膜炎折磨的很难受,一天学不了多久眼睛就疼了,来玩玩这个项目吧。

    知识点

    1: in_array 绕过

    in_array
    (PHP 4, PHP 5, PHP 7)

    in_array — 检查数组中是否存在某个值

    说明 ¶
    in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool
    大海捞针,在大海(haystack)中搜索针( needle),如果没有设置 strict 则使用宽松的比较。

    参数 ¶
    needle
    待搜索的值。

    Note:

    如果 needle 是字符串,则比较是区分大小写的。

    haystack
    待搜索的数组。

    strict
    如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。

    返回值 ¶
    如果找到 needle 则返回 TRUE,否则返回 FALSE。

    例如文件名为 7shell.php 。因为PHP在使用 in_array() 函数判断时,会将 7shell.php 强制转换成数字7,而数字7在 range(1,24) 数组中,最终绕过 in_array() 函数判断。(这里之所以会发生强制类型转换,是因为目标数组中的元素为数字类型)

    2:不能使用拼接函数的 updatexml 注入

    当 updatexml 中存在特殊字符或字母时,会出现报错,报错信息为特殊字符、字母及之后的内容,也就是说如果我们想要查询的数据是数字开头,例如 7701HongRi ,那么查询结果只会显示 HongRi 。所以我们会看到很多 updatexml 注入的 payload 是长这样的 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) ,在所要查询的数据前面凭借一个特殊符号(这里的 0x7e 为符号 ‘~’ )。
    一个常见的报错注入payload

    updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
    

    但是我们这里不能这样使用,因为waf把concat等常见字符串拼接函数过滤了。

    这里的话我们可以使用冷门的字符串处理函数绕过

    make_set函数
    MAKE_SET(bits,str1,str2,...)
    返回一个设定值 (一个包含被‘,’号分开的字字符串的字符串) ,由在bits 组中具有相应的比特的字符串组成。str1 对应比特 0, str2 对应比特1,以此类推。str1, str2, ...中的 NULL值不会被添加到结果中。

    mysql> SELECT MAKE_SET(1,'a','b','c');

    -> 'a'

    mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');

    -> 'hello,world'

    mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');

    -> 'hello'

    mysql> SELECT MAKE_SET(0,'a','b','c');

    -> ''

    bits应将期转为二进制,如,1为,0001,倒过来排序,则为1000,将bits后面的字符串str1,str2等,放置在这个倒过来的二进制排序中,取出值为1对应的字符串,则得到hello

    1|4表示进行或运算,为0001 | 0100,得0101,倒过来排序,为1010,则'hello','nice','world'得到的是hello word。'hello','nice',NULL,'world'得到的是hello。null不取,只有1才取对应字符串

    类似的函数:lpad()、reverse()、repeat()、export_set()(lpad()、reverse()、repeat()这三个函数使用的前提是所查询的值中,必须至少含有一个特殊字符,否则会漏掉一些数据)。

    还有一个要注意的是:updatexml报错最多只能显示32位,这种情况下我们结合SUBSTR函数来获取数据就行了。

    分析源码

    在下图第11~13行处,程序把用户的ID值存储在 $whitelist 数组中,然后将用户传入的 id 参数先经过stop_hack函数过滤,然后再用 in_array 来判断用户传入的 id 参数是否在 $whitelist 数组中。这里的白名单是数字1~5.
    这里 in_array 函数没有使用强匹配,所以是可以绕过的,例如: id=1’ 是可以成功绕过 in_array 函数的。即经过强制类型转换后id=1

    payload

    127.0.0.1:88/day1/?id=1 and (select updatexml(1,make_set(3,'~',(select flag from flag)),1))
    

  • 相关阅读:
    localtime 和 localtime_r 的区别
    mysql1130远程连接没有权限的解决方法
    pthread_create
    GDB Core,gdb 调试大全,core文件调试
    非root用户 如何将cscope安装到指定目录,vim74安装
    linux查看网络链接状况命令netstat
    在Linux系统如何让程序开机时自动启动
    Linux开机启动程序详解
    u盘出现大文件无法复制的解决
    用JSON报的一个错误java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeExcep
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12770965.html
Copyright © 2011-2022 走看看