php正则函数抓取网页连接(就是注入,可以理解就是把用户可控的一些变量,带入到数据库操作当中)
优采云 发布时间: 2022-01-04 03:08php正则函数抓取网页连接(就是注入,可以理解就是把用户可控的一些变量,带入到数据库操作当中)
注入,可以理解为将一些用户可控的变量带入数据库操作中,造成改变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\
如果又是双查询,吃单引号,然后再注入下一个连接的可控变量