PHP代码审计 -1.SQL注入总结
0x01 背景
最近在学习PHP代码审计,这里做一个SQL注入总结,是对自己学习知识的总结,也是为自己学习的笔记,方便自己反复翻阅。
0x02 PHP代码审计-SQL注入
挖掘SQL注入漏洞的时候,最简单也最容易被发现的就是什么都没过滤的情况。
代码示例
<?php $id = $_REQUEST[ 'id' ]; //接收参数 $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; //sql语句拼接 $result = mysql_query( $query ) ; //带入数据库执行 ?>
什么都没过滤的情况下,我们只需按照参数拼接的位置去构造POC,参数位置可能在select/insert/update/delete或者order by/group by /having/limit等关键字之后,这需要我们对sql注入有一个比较清晰的认知,方能快速构造POC。
0x03 绕过全局防护
现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号。遇到这种情况我们就需要找一些编码解码的函数来绕过全局防护。
情况一:urldecode()
' url编码是%27
% url编码是%25
%2527 ---服务器接收参数进行还原---%27--urldecode解码--单引号
%252527---urldecode解码--%2527--urldecode解码---%27(单引号)
<?php
$id= mysql_real_escape_string($_GET[ 'id' ]); //模拟全局过滤
echo $id;
echo "<br />";
$id=urldecode($id); //模拟url解码
echo $id;
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; //sql语句拼接 $result = mysql_query( $query ) ;
?>
通过%2527绕过单引号的过滤,然后通过url解码为%27,从而绕过单引号的过滤,带入到数据库操作,造成sql注入。
情况二: base64_decode()
通过base64_decode解码,从而绕过单引号的过滤,把单引号带入数据库。
代码示例如下:
<?php
$id= mysql_real_escape_string($_GET[ 'id' ]); //模拟全局过滤
echo $id;
echo "<br />";
$id=base64_decode($id); //模拟base64_decode解码
echo $id;
echo "<br />";
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; $result = mysql_query( $query ) ;
?>
情况三:宽字节注入
宽字节注入,宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而导致的注入漏洞。具体原理如下: 1.正常情况下当GPC开启或使用addslashes函数过滤GET或POST提交的参数时,黑客使用的单引号 ‘ 就会被转义为: \’; 2.但如果存在宽字节注入,我们输入%df%27时首先经过上面提到的单引号转义变成了%df%5c%27(%5c是反斜杠\),之后在数据库查询前由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成了汉字“運”(注:GBK的汉字编码范围见附录),而单引号逃逸了出来,从而造成了注入漏洞。 现在基本上都会将mysql的连接配置为“set character_set_client=binary”来解决这个问题 。
输入-- 錦’,“錦”这个字,它的utf-8编码是e98ca6,它的gbk编码是e55c,而上面提到过反斜杠\正好为5c,首先经过addlashes函数或GPC对单引号转义变为:錦\’,然后这里注册时会经过icnov函数会对”錦”转化为gbk编码,最后就是:%e5%5c%5c%27。反斜杠被转义了(%5c%5c),从而单引号逃逸出来引发注入漏洞。
POC:
%E9%8C%A6%27%20union%20select%201,2,3,user(),5,6,7,database(),9%23
因为# %0a的一些闭合都被过滤了,可以使用-<a>- a会在浏览器执行为-- a这样就闭合了
情况四:二次注入
二次注入也是一种比较常见的注入,它涉及到入库和出库。因为有全局转义所以入库的时候:
Insert into table (username) values (‘hack\’’); 这样入库后转义符就会消失变成了hack’,这样如果hack’出库被带入查询的话就会成功的引入了单引号导致注入。
0x04 可能存在的注入点
1、注入点类似id=1这种整型的参数就会完全无视GPC的过滤;
2、注入点包含键值对的,那么这里只检测了value,对key的过滤就没有防护;
3、有时候全局的过滤只过滤掉GET、POST和COOKIE,但是没过滤SERVER。 附常见的SERVER变量(具体含义自行百度):QUERY_STRING,X_FORWARDED_FOR,CLIENT_IP,HTTP_HOST,ACCEPT_LANGUAGE
4、FILES注入,全局只转义掉GET、POST等传来的参数,遗漏了FILES;
5、变量覆盖,危险函数:extract()、parse_str()、$$。
6、 is_numberic函数
最后
欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。

PHP代码审计 -1.SQL注入总结的更多相关文章
- 代码审计之SQL注入:BlueCMSv1.6 sp1
		Preface 这是一篇纪录关于BlueCMSv1.6 sp1两个SQL注入的审计过程,原文来自代码审计之SQL注入:BlueCMSv1.6 sp1 ,主要纪录一下个人在参考博文复现这两个漏洞经过. ... 
- PHP代码审计之SQL注入
		代码审计之SQL注入 SQL注入攻击(SQLInjection),是攻击者在表单中提交精心构造的sql语句,改变原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击. ... 
- ZZZPHP1.61 代码审计-从SQL注入到Getshell
		近期有很多小伙伴在后台留言想看关于代码审计的文章,其实有关审计的文章网上资源是比较多的,但是从代码审计开始到结束的这类文章却少之甚少. 今天要讲解的ZZZPHP1.61这套审计漏洞比较多,SQL注入漏 ... 
- [代码审计]某租车系统JAVA代码审计[前台sql注入]
		0x00 前言 艰难徘徊这么久,终于迈出第一步,畏畏缩缩是阻碍大多数人前进的绊脚石,共勉. 系统是租车系统,这个系统是Adog师傅之前发在freebuf(http://www.freebuf.com/ ... 
- 代码审计之SQL注入
		0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ... 
- PHP代码审计笔记--SQL注入
		0X01 普通注入 SQL参数拼接,未做任何过滤 <?php $con = mysql_connect("localhost","root"," ... 
- 代码审计之SQL注入及修复
		在新手入门web安全的时候,sql注入往往是最先上手的一个漏洞,它也是危害相当大的一个漏洞,存在此漏洞的话,将有被脱裤的风险. 以下所有代码都是我自己写的,可能有不美观,代码错误等等问题,希望大家可以 ... 
- PHP代码审计入门(SQL注入漏洞挖掘基础)
		SQL注入漏洞 SQL注入经常出现在登陆页面.和获取HTTP头(user-agent/client-ip等).订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTT ... 
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode
		0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.同上一篇,我 ... 
随机推荐
- LeetCode: Text Justification 解题报告
			Text Justification Given an array of words and a length L, format the text such that each line has e ... 
- ecshop和ucenter的整合
			按照网上的教材,一直提示数据库.密码错误,开始怀疑代码错了,毕竟都是两个老古董. 于是开始调试,居然调试也不能很好的支持,点击下一步后就卡死了,好吧,只好用log大法了, error_log(prin ... 
- 【JS】通过JS实现超市小票打印功能——ActiveX控件
			应客户的需求= = ,要在网页端实现打印小票的功能 先来一张打印出的小票效果图(合计明显不对,因为有修改订单功能,请各位忽略) 用什么方法实现呢: 我想应该是有三种吧 1.用第三方的浏览器控件(这个好 ... 
- jffs2根文件系统制作
			http://www.eetop.cn/blog/html/98/510998-20964.html 作者:刘洪涛,华清远见嵌入式学院高级讲师,ARM公司授权ATC讲师. JFFS2是Flash上应用 ... 
- Yii CDbCriteria常用用法
			$criteria = new CDbCriteria;$criteria->compare('name',$this->name,true,'OR'); //like部分匹配//$cri ... 
- 关于Trie树的模板
			Trie树又称单词查找树,Trie树,是一种树形结构.是一种哈希树的变种.典型应用是用于统计.排序和保存大量的字符串(但不仅限于字符串),所以常常被搜索引擎系统用于文本词频统计. 它的长处是:利用字符 ... 
- kill 的常用信号
			kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令.通常,我们在需要终止某个或某些进程时,先使用ps/pidof/pstree/top ... 
- 关于Cocos2d-x的瓦片地图
			1.cocos2d-x的瓦片地图是用Tiled地图编辑器做的,这个软件开源,免费,一般都是用它制作瓦片地图. 2.瓦片地图是由块层和对象组成的,块层的作用是显示和一些重叠的时候覆盖角色的作用,而对象是 ... 
- 帝国cms的list.var中使用php函数
			$r[title] = esub($r[title],8,'...'); //截取前8个字符,多出部分用...代替 $r[title] = str_replace("lhj",&q ... 
- 初识Comet技术
			一.服务器推送技术概述 服务器推送技术(Servers Push)的基础思想是将浏览器主动查询信息改为服务器主动发送信息.服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接.当服务器需要再 ... 
