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注入总结的更多相关文章

  1. 代码审计之SQL注入:BlueCMSv1.6 sp1

    Preface 这是一篇纪录关于BlueCMSv1.6 sp1两个SQL注入的审计过程,原文来自代码审计之SQL注入:BlueCMSv1.6 sp1 ,主要纪录一下个人在参考博文复现这两个漏洞经过. ...

  2. PHP代码审计之SQL注入

    代码审计之SQL注入 SQL注入攻击(SQLInjection),是攻击者在表单中提交精心构造的sql语句,改变原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击. ...

  3. ZZZPHP1.61 代码审计-从SQL注入到Getshell

    近期有很多小伙伴在后台留言想看关于代码审计的文章,其实有关审计的文章网上资源是比较多的,但是从代码审计开始到结束的这类文章却少之甚少. 今天要讲解的ZZZPHP1.61这套审计漏洞比较多,SQL注入漏 ...

  4. [代码审计]某租车系统JAVA代码审计[前台sql注入]

    0x00 前言 艰难徘徊这么久,终于迈出第一步,畏畏缩缩是阻碍大多数人前进的绊脚石,共勉. 系统是租车系统,这个系统是Adog师傅之前发在freebuf(http://www.freebuf.com/ ...

  5. 代码审计之SQL注入

    0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ...

  6. PHP代码审计笔记--SQL注入

    0X01 普通注入 SQL参数拼接,未做任何过滤 <?php $con = mysql_connect("localhost","root"," ...

  7. 代码审计之SQL注入及修复

    在新手入门web安全的时候,sql注入往往是最先上手的一个漏洞,它也是危害相当大的一个漏洞,存在此漏洞的话,将有被脱裤的风险. 以下所有代码都是我自己写的,可能有不美观,代码错误等等问题,希望大家可以 ...

  8. PHP代码审计入门(SQL注入漏洞挖掘基础)

    SQL注入漏洞 SQL注入经常出现在登陆页面.和获取HTTP头(user-agent/client-ip等).订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTT ...

  9. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.同上一篇,我 ...

随机推荐

  1. 关于一个页面的tab切换整体页面刷新而tab标签处是同一个文件怎么做焦点的问题

    解决方法,不能直接写点击效果就要在超链接中加一个参数,根据参数的值去给变焦点的效果,实现方法如下: <div class="vip_search">           ...

  2. 使用Eclipse创建的第一个javabean,cannot resolved to a type

    第一个原因是我没有把eclipse编译好的class文件放在项目的build文件夹中的(我创建的是dynamic web project),你要把/build/classes/文件夹给合并到WebCo ...

  3. pku oj overhang叠加卡片求最少的卡片数

    这个估计是里面第二简单的了,因为第一简单的是求a+b 哈哈,一submit就ac了 题目如下: Description How far can you make a stack of cards ov ...

  4. Yarn NodeManager restart

    一.介绍默认Yarn NodeManager重启后会断开所有当前正在运行的container的状态,这意味着重启后需要重新启动container进程,该特性的作用就是把NM的状态临时保存到本地,重启后 ...

  5. hive中创建表失败

    使用create table命令创建表失败,如下错误信息: hive> create table test(id int,name string,age int,sex string); FAI ...

  6. brew install mac安装失败的问题

    问题:brew 安装失败思路:将github仓库放到本地,不用ruby下载解决办法:1.下载https://raw.githubusercontent.com/Homebrew/install/mas ...

  7. laravel bald视图控制流与子视图

    1:laravel 视图控制流的写法 假设控制器代码如下 $data = [ 0 => '张三', 1 => '李四', 2 => '王五' ]; return view('test ...

  8. 关于Cocos2d-x程序运行时候提示关闭程序的框框的解决方法

    1.这个情况是资源没有被加载的表现 如果AppDelegate.cpp里面没有文件索引的语句 FileUtils::getInstance()->addSearchPath("res& ...

  9. selenium测试(Java)--关闭窗口(二十)

    quit方法:退出相关的驱动程序和关闭所有窗口 close方法:关闭当前窗口 package com.test.closewindow; import java.util.Iterator; impo ...

  10. Android ListView 笔记

    ListView以列表的形式展示数据内容. 布局文件如下所示,添加一个ListView. activity_main.xml <?xml version="1.0" enco ...