php正则函数抓取网页连接(就是注入,可以理解就是把用户可控的一些变量,带入到数据库操作当中)

优采云 发布时间: 2022-01-04 03:08

  php正则函数抓取网页连接(就是注入,可以理解就是把用户可控的一些变量,带入到数据库操作当中)

  注入,可以理解为将一些用户可控的变量带入数据库操作中,造成改变sql初衷的效果。例如,在注册用户的逻辑中,在检测用户名是否存在时,将用户提交的用户名带到数据库中进行查询。如果代码逻辑中没有对用户名进行适当的过滤,用户可以提交一些特殊字符来完成注入。

  

  按照SQL分类,一般有四种注入:

  选择

  更新

  插入

  删除

  如果出现mysql错误,这四个可以注入错误报告,非常方便;如果没有mysql错误

  Select 注入:可以尝试使用 union select+echo 注入。如果没有回声,则只能使用盲注。

  更新注入:如果是在更新集的位置,那么我们就可以找到这个表的哪一列会被显示出来。比如一个更新的注入点在user表中,并且设置的位置可控,那么我们可以更新email列,然后去user profile查看我们的email输出数据。例如,更新表 set email=( select user());如果是在where之后,那么它通常是盲目的。

  insert的注入:一般是找出哪一列不会显示,尝试将要输出的数据插入到该列中。如果不显示,也是盲注。

  删除注入:通常是盲注。

  数字注入主要是因为它的变量没有用单引号括起来。不过基本都被强制了,比如intval($username)什么的。但有时也有遗漏。

  字符类型和搜索类型都用单引号括起来。所以需要在注入前关闭单引号。

  说到单引号,不得不说php.ini中的Magic_quotes_gpc配置,稍高的版本默认是开启的,但是在5.4中已经取消了。

  从字面上看,这意味着 QUOTE 到 GPC。 GPC 对应于 GET、POST 和 COOKIE。内容中要转义的字符是'"\NULL,转义的方式是在前面加一个转义符,这样就失去了原来的意义,不能关闭。注入单引号。

  全局没有附加斜杠

  像这种全局一样,GET/POST/COOKIE 没有加斜杠。这种厂家在查询的时候基本都会在一些用户可控的变量上加斜杠,甚至直接带入查询中,不加斜杠。 .

  即使你在查询过程中执行了addslashes,在很多情况下你也可以找到几个缺失的addslashes。这种比较简单,不多说了。

  全局添加斜杠

  稍微好一点的厂商现在都知道在全局文件中给GET/POST/COOKIE加斜杠(甚至是在引入查询的函数中进行转义或者预编译,这种下跪) 所以基本上不用担心遗漏或者忘记addlashes)这种基本就是先获取魔术引号gpc来判断gpc是否开启,如果没有,则调用addlashes进行转义。如果启用,它将不会用于addslashes。如果未打开,则添加斜杠。

  说说一些常见的注入方式

  宽字节注入

  这是一个老式的问题。数据库字符集GBK的宽字节注入从开始到现在已经很久了。但是如果字符集是GBK,则无法注入宽字节。

  总有朋友说cms字符集我觉得是gbk,但为什么不能是宽字节的呢?

  这是因为数据库连接方式不同。连接数据库时,可以使用Set names gbk to wide byte。

  但现在你几乎看不到这样的东西。因为二进制读数基本设置好了。这种宽字节基本没有了,但是由于字符集转换导致的宽字节注入,还有一种。比如从utf8到gbk,或者从gbk到utf8什么的。

  示例:WooYun: 74cms 最新版本注入 8-9

  分析:字符“Jin”,从UTF8转GBK,变成%e5%5c74,cms给GET/POST/COOKIE加斜杠等,所以'转义后变成\'-> %5C %e5%5c%5c' 两个\,单引号出来了。

  示例2:WooYun:qibocms下载系统SQL注入(官网可复现)

  解码导致注入

  因为在全局文件中添加了斜杠,如果我们能找到一些已解码的,比如urldecode,base64_decode等,那么我们先提交encode,然后就不会被转义了。然后解码后把query带进来,造成注入,忽略gpc。

  这种事情很常见。

  例子很多,随便找一个

  例子:WooYun:qibocms B2b注入一个//qibocms注入

  示例:WooYun: phpdisk V7 sql injection 2 //phpdisk injection

  变量覆盖引起的注入

  公共变量覆盖extract和parse_str函数是什么?当然还有$。

  变量覆盖结合一些特定场景。

  比如extract($_POST)什么的,直接从POST数组中提取变量。我遇到了其中的几个,然后覆盖了之前的一些变量。

  如果被覆盖,一般会覆盖表前缀。比如Select * from $pre_admin where xxx 像这样会覆盖$pre,然后直接完成语句并注入。

  例如:WooYun:qibocms分类注入一枚*敏*感*词*,提升管理能力

  示例 2:WooYun:将一个注入 phpmps

  当然,$ 也经常使用。这个例子很好。

  示例3:WooYun:最新版本的MetInfo(5.2.4)一个SQL盲注漏洞

  某些更换引起的注入

  在一些cms中,总有一些有趣的过滤功能,比如用空替换'什么的,但他似乎忘记了自己已经全局逃脱了。

  此时,当用户提交a'时,全局转义为\',然后过滤器函数会将'替换为空,然后剩下\,可以吃单引号,如果是双重查询

  select * from c_admin where username='admin\' and email='inject#'

  这个可以注入。

  示例:WooYun:PHPcms所有版本杀SQL注入漏洞

  当然,有些替代品是用户可控制的。这意味着用户可以提交任何他们想要为空的东西,比如很久以前的cmseasy和ecshop的注入。

  例如这段代码:

  $order_sn = str_replace($_GET['subject'],'',$_GET['out_trade_no']);

  因为这里会被转义,如果你submit'it变成\',这里可以看到这里清除的是我们的get,那我们就想办法替换\。

  但是如果我们提交\替换为GET,就会被转义,即替换\。

  但我们只是\',所以\不能被删除。如果我有\,我需要你清空我的头发。

  在这里我们来澄清一下我们的想法:

  加斜杠将转义 '"\ NULL

  ' => \'" => \"\ => \\NULL => \0

  然后我们在这里提交',然后转义生成\0\'。这时候我们再次提交,将0替换为空,然后变成\',单引号就成功了。

  示例:WooYun:cms轻松绕过补丁SQL注入一

  由未转义的SERVER引起的注入

  因为在许多 cms 中,基本上只是在不转义 SERVER 的情况下向 GET POST COOKIE 添加斜杠。一些 SERVER 变量也是用户可控的。

  例如,QUERY_STRING X_FORWARDED_FOR CLIENT_IP HTTP_HOST ACCEPT_LANGUAGE 很多。

  当然这里最常用的是X_FORWARDED_FOR,一般在ip函数中使用。如果没有后续验证ip是否合法,则直接返回,多数情况下会导致注入。

  示例 1:WooYun:Phpyun 注入漏洞 2

  说到验证ip,这里基本都是用regulars来验证是否合法。有的厂商甚至把常规规则写错了。

  比如cmseasy中验证ip的正则(%.+)中,后面可以写任意字符。

  示例2:WooYun:cms简单的最新版无限制SQL注入

  由未转义的文件引起的注入

  这个是一样的,因为全局只转义COOKIE GET POST,FILES被省略,不受gpc影响。

  FILES注入一般是由于上传,会将上传的名字带入insert并存入数据库。那么这里的文件名是我们可以控制的,导致注入。

  例子:WooYun:qibocms黄页系统SQL注入一

  有的,在库的时候文件名被转义了,得到后缀后,存储的时候文件名被转义了,但是后缀没有转义,这也导致注射

  示例:WooYun:Supesite 前景注入 #2(插入)

  未初始化导致的注入

  很久以前的php

  register_globals 的缺点也是后来出现的,所以很久以前就默认关闭了。

  现在,许多cms喜欢模仿 register_globals 并建立一个伪全局机制。

  比如什么qibocmsmetinfo destoon。

  这样方便很多,但是如果省略初始化,就会造成注入。感觉这个挺好玩的。我又找到了几个例子。

  示例:WooYun:qibocms本地门户系统注入问题(演示测试)

  示例:WooYun:qibocms本地门户系统注入(很多地方类似,demo测试)

  示例:WooYun:奇博本地门户系统中的SQL注入漏洞(无需登录即可批量处理)

  示例:WooYun:奇博站点/本地门户SQL注入漏洞

  由数组中的键引起的注入

  因为在转义全局的时候,很多cms只是判断gpc是否开启。如果关闭,则向数组中的值添加斜杠,但忘记对数组中的键进行转义。

  所以这也造成了一个问题。即gpc关闭时,数组的key没有过滤,导致引入单引号。 (听说低版本的php即使gpc on也不会转义二维数组中的key)

  如果把数组中的key读出来,再把key带入查询中,也会造成安全问题。

  这样的例子还有很多。太可怕了。

  示例:WooYun:qibocms V7 最新版全站系统SQL注入 又一个可以引入转义字符的地方。 //注入数组key

  示例:WooYun:qibocms多个系统绕过补丁继续注入2

  示例:WooYun:qibocms所有开源系统Getshell

  示例:WooYun:Discuz 5.x 6.x 7.x 前端 SQL 注入漏洞

  偏移引起的注入

  这是一种比较常见的注入方式。

  代码大致如下:

  如果$_GET[a]提交一个数组并且收录一个key为0,那么$a就是对应key的值。

  但是这里没有强制要求是数组。

  然后我们提交一个字符串,那么下面的[0]就是截取的第一个字符。在全局上下文中,单引号转义为\',第一个字符被截取为\。 \ 会吃单引号,然后在$b处写inject来注入。

  示例:WooYun:qibocms 本地门户系统注入#4(演示测试)

  同样适用于地图发送的Disucz7.2的注入。

  第三方插件导致的注入

  一种很常见的洞。

  比较常见的uc和支付宝财付通chinabank,特别是uc,因为uc默认会有striplashs

  uc,一般遇到的问题都是uckey的默认。或者uckey常量根本没有初始化,导致uckey可控,进而导致Getshell或者注入。

  还有支付宝和支付宝,有些是因为忘记收录过滤文件,key默认为空,导致校验不通过。

  示例:WooYun:phpmps注入(可以修改其他用户的密码,官网成功)//phpmps uc导致注入

  示例:WooYun:PHPEMS(在线考试系统)设计缺陷Getshell一(官网有shell)/phpems uc to getshell

  例如:WooYun:最原生的团购,可以直接提升自己的管理和无限金钱。 //最土团购注资中行

  Example: WooYun: Desoon Sql 注入漏洞2(条件) //destoon tenpay 导致注入

  例子:WooYun:CSDJcms程序舞动的Sql最新版本//csdj财付通注入

  数字注入

  其实不光是数字类型,只是有些地方忘记加单引号是这样的。这只是没有单引号的一般数字类型。

  一般来说:

  $id=$_GET[id];Select * from table where id=$id;

  $id,不是单引号,也没有被强制,那么即使addslashes,由于不需要关闭单引号,所以没有作用。

  示例:WooYun:qibocms 本地门户系统注入#3(演示测试)

  不是一些数字类型,其他一些点也忘记加单引号,导致注入。

  示例:WooYun:Supesite 前景注入 #3(删除)

  二次注入

  也是比较常见的注入。所涉及的是入站和出站。因为有全局转义,当存入库时

  插入表(用户名)值('a\'');

  这样进入库后转义符就会消失,所以是a'。如果查询再次出现,则传出项目是 a'。如果outbound item被带入查询什么的,那么单引号又成功引入导致注​​入。

  示例:WooYun:phpyun v3.2 (20141226) 两次注射。

  示例:WooYun:qibocms 本地门户系统二次注入#5(演示测试)

  示例:WooYun: 74cms (20140709) 两秒注射

  示例:WooYun:第二次注入最新版本的Hdwiki

  截取字符导致的注入

  有些cms有时会限制用户输入的长度,所以只截取了一部分

  比如uchome的cutstr($asd,32);

  这个只允许输入32个字符,uchome里面的这个不会截取dz和add之类的字符...

  所以如果我们提交一个 111111111’

  转义后变成111111111\’

  然后截取32个字符,即111111111\

  如果又是双查询,吃单引号,然后再注入下一个连接的可控变量

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线