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 ...
随机推荐
- 一文读懂Redis常见对象类型的底层数据结构
Redis是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集合( ...
- UML类图还不懂?来看看这版乡村爱情类图,一把学会!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.码场心得
- JS获取DropDownList选择项的值
var dropDownList= document.getElementById("<%=DropDownListID.ClientID %>");//获取DropD ...
- 【事件中心 Azure Event Hub】关于EventHub中出现Error时候的一些问题(偶发错误,EventHub后台升级,用户端错误,Retry机制的重要性)
请问对偶发的定义是多少频率? 针对偶发的定义,主要是看发生的时间非常短,次数极少(如 10次以内),并且发生的时候EventHub其他分区或其他连接都是正常接收和发送数据.所以对于频率是没有明确的定义 ...
- eclipse快捷键(Mac版)整理
eclipse快捷键(Mac版)整理 前言: 最近在学习JDBC,老师用的是eclipse,对于习惯了IDEA的我来说,没有了快捷键,效率明显下降. 我认为,开发工具的熟练使用,也是程序员必备的一项技 ...
- 2020-2021-1 20209306 《linux内核原理与分析》第二周作业
一.实验一内容及分析 1.实验一内容过程截图 2.实验一完成后收获 可以看到汇编代码中出现了eax.esp.ebp.eax是累加寄存器,esp是堆栈指针寄存器,ebp是基指针寄存器.汇编代码中用到了m ...
- Jupyter Notebook使用教程
关于安装我就不说了,可以参考知乎https://zhuanlan.zhihu.com/p/33105153(总结的很全面) 首先打开Jupyter Notebook后,新建notebook:点击右上角 ...
- USB引脚属性
1.各型号usb 2.type c接口 type c母头 type c公头 usb type c三种工作模式: usb 3.1有三种工作模式: 1:DRP.主HOST/DEVICE可自由转换,类似电脑 ...
- Luogu P4172 [WC2006]水管局长
题意 给定一个 \(n\) 个点 \(m\) 条边的图和 \(q\) 次操作,每次操作分为以下两种: 1 u v:查询 \(u\) 到 \(v\) 的一条路径使得边权最大的边的权值最小. 2 u v: ...
- 专题四:redis的数据类型之list
一.基本介绍 对于list,它的存储需求是什么呢?对于string,讲究单个,hash也不讲究大量:当我们需要存储多个数据的时候,前面的数据类型就不大合适了. 数据存储需求:存储多个数据,并对数据进入 ...