论PHP常见缝隙第三弹:注入缝隙 8090安适门户
注入,概略就是把用户可控的一些变量,带入到数据库操纵傍边,并且造成转变sql原意的效果。譬如注册用户的逻辑中,检测用户名是否存在的时候,把用户提交过来的用户名拿到数据库中去盘问。如果代码逻辑中没有对用户名做好过滤的话,用户就可以提交一些特殊字符来完成注入。
此刻注入的主要原因是很多措施员在写sql语句的时候,还是喜欢搞语句拼接。
按照sql分类,注入一般分四种类型:
select
update
insert
delete
如果有mysql error的话,这四种都能用报错注入,非常便利;如果没有mysql error
select的注入:可以试下用union select+回显来注入,如果没有回显,那就只能够用盲注了。
update的注入:如果是在update set的位置的话,那么我们可以找找这个表的哪个column会被展示出来。例如如果一个update的注入点是在用户表且是在set位置可控的话,那么我们可以update email这个column,然后去用户资料看一下本身的email就出数据了,语句例如update table set email=(select user());如果是在where后的话,那么一般也就是盲注了。
insert的注入:一般也是通过找哪个column会不会显示出来,尽量把要出的数据插入到这个column里面去。 如果没显示的话,也是盲注。
delete的注入:一般都是盲注了。
数字型注入主要就是因为他的变量并没有用单引号引住。但是根基上都是被强制类型转换了,譬如intval($username)啥的。但是有时候会有遗漏的嘛。
而字符型和搜索型的,都是会有单引号引住的。所以需要闭合单引号再来进行注入。
说到单引号不得不说个php.ini里的配置Magic_quotes_gpc,在稍微高点的版本默认都是on,但是却在5.4就已经铲除了。
从字面意思上来看,就是对GPC QUOTE嘛。GPC对应的就是GET、POST和COOKIE,此中的内容,会被转义的字符为 ' “ \ NULL,转义的方法是在前面添加上一个转义符。从而导致了掉去原来的意义,无法闭合单引号进行注入。
像这种全局没有对GET/POST/COOKIE做addslashes的,这种厂商根基是会在盘问的时候,再对一些用户可控的变量进行addslashes,甚至是不进行addslashes直接带入盘问的。
这样的就算在盘问的时候进行addslashes,在很多时候也都能找到几处遗漏了addslashes的。这种的对照简单,不久不多说。
全局做addslashes此刻稍微好一点的厂商都知道了在全局文件中对GET/POST/COOKIE做addslashes (甚至是在带入盘问的函数中再做了转义或者预编译,这种给跪) 所以根基不用担忧哪里遗漏了哪里忘记了addslashes) 这种的根基是首先先get magic quotes gpc 判断gpc是否开启,如果没开启的话,再挪用addslashes来转义。如果开启的话,就不用来addslashes了。没开启就addslashes。
下面讲一些常见的注入方法
宽字节注入这个是一个老生常谈的问题, 从一开始的数据库字符集GBK的宽字节注入,到此刻也有很久了。但是并不是字符集为GBK的就能宽字节注入。
总有一些小伙伴说咋我看的cms字符集是gbk的,但是咋不能宽字节呢?
这是因为数据库的连接方法差别。数据库连接的时候,使用了Set names gbk这样的就能宽字节。
但是此刻这样的根基都看不到了。因为根基都是设置了二进制读取了。这样的宽字节根基没了, 却有了此外一种,因为转换字符集造成的宽字节注入。譬如从utf8转到gbk,或者从gbk转到utf8什么的。
例子: WooYun: 74cms 最新版 注入8-9
解析:“錦”字,从UTF8转成GBK之后成了 %e5%5c 74,cms对GET/POST/COOKIE等都做了addslashes ,所以'转义后为\' ->%5C %e5%5c%5c' 两个\,则单引号出来了。
例子2: WooYun: qibocms 下载系统SQL注入一枚(官网可重现)
解码导致注入因为在全局文件中addslashes,如果我们能找到一些解码的,例如urldecode、base64_decode之类的,那么我们先提交encode之后的,那么就能不被转义了。然后decode后,再带入盘问,造成了注入,无视gpc。
这种的很常见。
例子很多 随便找一个
例子: WooYun: qibocms B2b 注入一枚 //qibocms 注入
例子: WooYun: phpdisk V7 sql注入2 //phpdisk 注入
常见的变量笼罩 有啥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盲注缝隙
一些replace造成的注入
一些cms中,总有一些逗比过滤函数,譬如会把’ 啥的replace成空,但是他似乎忘记了本身全局有转义。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12602.html