PHP代码审计入门(SQL注入漏洞挖掘基础)
SQL注入漏洞
SQL注入经常出现在登陆页面、和获取HTTP头(user-agent/client-ip等)、订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTTP头里面的client-ip和x-forward-for。
1.普通注入
普通注入是指最容易利用的SQL注入漏洞,比如直接通过注入union查询就可以查询数据库,一般的SQL注入工具也能够非常好地利用。普通注入有int型和string型
测试环境搭建:
数据库名为test 数据库表名userinfo 以下时数据库数据


测试出SQL注入漏洞

从上面我们可以看出我们使用union查询到当前的用户
从上面的测试代码中可以发现,数据库操作存在一些关键字,比如 select from、mysql_connect、mysql_query、mysql_fetch_row等,数据库的查询方式还有update、insert、delete 我们在做白盒审计时,只需要查找这些关键字,即可定向挖掘SQL注入漏洞
2编码注入
程序在进行一些操作之前经常会进行一些编码处理,而做编码处理地函数也是存在问题地,通过输入转码函数不兼容地特殊字符,可以导致输出地字符变成有害地数据,在SQL注入里,最常见地编码注入是Mysql宽字节以及urldecode/rawurldecode函数导致的
2.1宽字节注入
在使用PHP连接mysql的时候,当设置set character_set_client=gbk 时会导致一个编码转换的注入问题,也就是我们所熟悉的宽字节注入。当存在宽字节注入漏洞时,注入参数里带入%df%27,即可把成程序中过滤的\(%5c)吃掉。
举个例子
我们可以看一个例子当我id=1加上‘号提交的时候 它将’号前面加了\很明显这样时注入不成功的。

但是我们如果提交/index.php?id=1%df’ and 1=1%23 由于单引号会被自动转义成\‘ ,前面的%df和转义反斜杠(%5c)组合成了%df%5c,就是一个字,这时候单引号依然存在于是就成功闭合了前面的单引号

出现这个漏洞的原因时PHP连接mysql的时候执行了如下设置
Set character_set_client=gbk
告诉mysql服务器客户端来源数据编码时GBK,然后mysql服务器对查询语句进行GBK转码导致反斜杠\被%df吃掉,而一般都不是直接设置character_set_client=gbk
告诉mysql服务器客户端来源数据编码时GBK,然后Mysql服务器对查询语句进行GBK转码导致反斜杠\被%df吃吃掉,而一般都不是直接设置character_set_client=gbk,通常设置方法时SET NAMES ‘gbk’,但其实SET NAMES ‘gbk‘不过是比character_set_client=gbk多干了两件事而已,SET NAMES ’gbk‘等同于如下代码:
SET
Character_set_connection=’gbk’,
Character_set_results=’gbk’,
Character_set_client=gbk
这同样也是存在漏洞的,另外官方建议使用mysql_set_charset方式设置编码,不幸的时它也知识调用了SET NAMES,所以效果也是一样的。不过mysql_set_charset调用SET NAMES之后还记录了当前的编码,留着给后面mysql_real_escape_string处理字符串的时候使用,所以在后面只要合理地使用mysql_real_escape_string还是可以解决这个漏洞的,关于这个漏洞的解决方法:
(1) 在执行查询之前先执行SET NAMES ‘gbk‘,character_set_client=binary设置character_set_client为binary。
(2) 使用mysql_set_chharset(‘gbk‘)设置编码,然后使用mysql_real_escape_string()函数被参数过滤。
(3) 使用PDO方式,在PHP5.3.6及以下版本需要设置setAttribute(PDO::ATTR_EMULATE_PREPATES,FALSE);来禁用prepared statements的仿真效果
宽字节注入挖掘关键字:
SET NAMES
Character_set_client=gbk
Mysql_set_charset(‘gbk‘)
环境搭建
数据库沿用普通注入里面的数据库

测试出SQL注入漏洞

mysql的特性,因为gbk是多字节编码,两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而’逃逸了出来。
宽字节挖掘关键字
SET NAMES
Character_set_clent=gbk
Mysql_set_charset(‘gbk’)
Mysql_set_charset(‘gbk‘)
2.2二次urldecode注入
只要字符被进行转换就有可能产生漏洞,现在web程序大多都会进行参数过滤,通常使用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数或开启GPC的方式进行防止注入,也就是给单引号、双引号、反斜杠和NULL加上反斜杠转义。如果某处试用了urldecode或者rawurldecode函数,则会导致二次解码生成单引号而引发注入。原理是我们提交参数到webserver时,webserver会自动解码一次
测试环境搭建:


我们可以看url部分%25经过第一次转码后的结果时%所以拼接后面的成为%27 而%27再经过urldecode经过第二次转码成为单引号成功引发注入
二次urldecode挖掘关键字
Urldecode
Rawurldecode
3.漏洞防范
在PHP中可以利用魔术引号来解决,不过魔术引号在PHP5.4后被取消,并且gpc在遇到int型注入时也会显得不那么给力了,所以通常用的多的还是过滤函数和类,像discuz、dedecms、phpcms等程序里面都使用过滤类,不过如果单纯的过滤函数写的不够严谨,也会出现绕过的情况,像这三套程序都存在绕过问题。当然最好的解决方案还是利用预编译的方式。
1. gpc/rutime 魔术引号
通常数据污染有两种方式,一种格式应用被动接受参数,类似于GET、POST等;还有一种是主动红红火火去参数,类似于读取远程页面或者文件内容等。所以放置SQL注入的方法就是要守住这两条路。Magic_quotes_gpc负责对GET、POST、COOKIE的值进行过滤,magiic_quotes_runtime对从数据库或者文件中获取的数据进行过滤 开启这两个选项之后能防住部分SQL注入 在int型注入上是没有多大作用的。
2.过滤类函数和类
(1)addslashes函数
Addslashhes函数过滤的值范围和GPC时一样的,即单引号(‘)、双引号(“)、反斜杠(\)及空字符NULL,它只是一个简单的检查参数的函数,大多数程序使用它实在程序的入口。

(2)mysql_[real_]escape_string函数
Mysql_escape_string和mysql_real_e3.scape_string函数都是对字符串进行过滤,在PHP4.0.3以上版本才有。

(3)intval等字符转换
以上里昂中过滤方式,在int类型注入时效果并不好,比如可以通过报错或者盲注方式绕过,这时候intval等函数就起作用了,intval的作用是将变量转换成int类型,这里距离intval是要表达的一种方式,一种利用参数类型白名单的方式来防止漏洞,对应的还有好很多如floatval等

2. PDO prepare预编译
待更新…….
PHP代码审计入门(SQL注入漏洞挖掘基础)的更多相关文章
- JAVA SQL注入漏洞挖掘
java中sql注入主要发生在model层,黑盒测试sql注入的方法结合两点:1,异常注入后,界面有无明显的aql异常报出.2,查看数据库日志是否有脏数据注入. preparestatement方法是 ...
- 代码审计(1):sql注入漏洞
挖掘经验:sql注入经常出现在登录界面.获取HTTP请求头.订单处理等地方.而登录界面的注入现在来说大多是发生在HTTP头里面的client-ip和x-forward-for,一般用来记录登录的ip地 ...
- 2020/1/27代码审计学习之SQL注入漏洞
PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...
- sqlmap查找SQL注入漏洞入门
1.安装sqlmap sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞.注意:sqlmap只是用来检测和利用sql注入点的,使用前请先使用扫描工具扫出sql注入点 ...
- 关于sql注入漏洞的挖掘及渗透工具简介
大量的现代企业采用Web应用程序与其客户无缝地连接到一起,但由于不正确的编码,造成了许多安全问题.Web应用程序中的漏洞可使黑客获取对敏感信息(如个人数据.登录信息等)的直接访问. Web应用程序准许 ...
- 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析
0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...
- 【代码审计】五指CMS_v4.1.0 后台存在SQL注入漏洞分析
0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...
- 【代码审计】大米CMS_V5.5.3 SQL注入漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- 【代码审计】XIAOCMS_后台database.php页面存在SQL注入漏洞
0x00 环境准备 XIAOCMS官网: http://www.xiaocms.com/ 网站源码版本:XiaoCms (发布时间:2014-12-29) 程序源码下载:http://www.xi ...
随机推荐
- Python可迭代对象和迭代器对象
可迭代对象iterable: 对象字面意思:Python中一切皆对象.一个实实在在存在的值. 可迭代:更新迭代.迭代是一个重复的过程,每次重复是基于上一次的结果而继续的,每次都有新的内容. 可迭代对象 ...
- CSS中-moz、-ms、-webkit、-o的意思
-moz代表firefox浏览器私有属性 -ms代表ie浏览器私有属性 -webkit代表safari.chrome浏览器私有属性 -o代表opera浏览器私有属性 上述这些是为了兼容老版本的写法:
- node运行js获得输出的三种方式
一.通过console.log输出(我最喜欢的) 1.js脚本 1.js var arguments = process.argv.splice(2); //获得入参 var a= arguments ...
- Java 8新特性解读
(四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...
- Spring源码分析之`BeanFactoryPostProcessor`调用过程
前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...
- 配置域名与Https
前言 在之前的内容里,我们已经实现了部署SpringBoot项目到云服务器,但是当时用的是直接通过ip+端口的方式访问的,在之后如果是想对接上自己开发的小程序的话,必须要https的地址才行,因此今天 ...
- java线程池拒绝策略使用实践
前言 线程池是开发过程中使用频率较高的一个并发组件之一,本篇会结合踩刀哥之前的实践经验来分享一下线程池拒绝策略的真实使用场景,至于线程池内部原理只会简单介绍,有需要的可以自行上网学习. 线程池工作机制 ...
- Java实现评论回复功能
目录 一.分类方式 1.单一型 2.嵌套型 3.两层型 二.实现原理 1.单一型 2.嵌套型 3.两层型 使用递归循环开发评论回复功能,适用于大部分的简单单体应用 评论功能或许是大多数的单体应用之中会 ...
- Linux 系统编程 学习:00-有关概念
Linux 系统编程 学习:00-有关概念 背景 系统编程其实就是利用系统中被支持的调度API进行开发的一个过程. 从这一讲开始,我们来介绍有关Linux 系统编程的学习. 知识 在进行Linux系统 ...
- MIT黑科技:通过手机记录的咳嗽数据检测是否感染新冠病毒
这次的新冠状病毒虽然没有2002年的SARS破坏力那么强悍,但其可怕之处是长时间的无症状潜伏,使得被感染者在不知情的情况下,将病毒散播出去.如果没有强有力的防疫手段,病毒的传播几乎难以控制.而防止病毒 ...