PHP安全之道3:常见漏洞和攻防
第一篇 SQL注入
安全配置和编程安全并不是万全之法,攻击者往往可以通过对漏洞的试探找到新的突破口,甚至0days。
下面总结以下常见漏洞,在日常开发维护工作中可以留意。
*聊聊老朋友:SQL注入漏洞
多年前我还在念本科三年级的时候就做了一次关于SQL注入的攻防实验,SQL注入在WEB1.0时代是非常常见的攻击手段,特别是一些远古时期的ASP、PHP站点,往往容易被注入提权。
简单来说SQL注入就是利用url中参数请求,不断尝试获取数据库信息,从猜字段,推测表,甚至到最后暴库得到后台管理员账号密码。
常见类型
A.报错注入
假设可以通过url来传递该参数,如:
https://learnhackerphp.com/search?username=freephp
如本来的sql为:
select * from users where name = 'freephp'
但是我们在浏览器浏览框中输入:
则sql语句变为:
select * from users where name='frephp'lol'
这会导致sql语句执行报错,如果我们开启了错误调试,可能会把数据库的错误堆栈打印到浏览器页面,这会被别有用心之辈利用。网站上线后一定设置display_errors=Off。
B.普通注入
例子如下:
https://localhost/search.php?name=name' OR 'a'='a
最终SQL为:
select * from user whre name=' name' OR 'a' ='a'
这变成了一个万能查询语句,可以查到你任何想要的数据,利用union和复合语句,甚至可以获取到数据库任何数据。
C.隐式类型注入
先了解一下MySQL默认的查询优化器对入参的处理:
输入类型 | 表字段类型 | 转换后的类型 |
---|---|---|
NULL | 任意类型 | NULL |
STRING | STRING | STRING |
INT | INT | INT |
INT | STRING | DOUBLE |
INT | DOUBLE | DOUBLE |
INT | TIMESTAMP | TIMESTAMP |
任意类型 | DECIMAL | DECIMAL |
任意类型 | 十六进制 | 二进制 |
编写如下sql:
select * from user whre address=0
可以获取到该表的所有数据
D.无套路方式试探
比如在SQL语句当中附加一些其他执行命令,如:
select * from user where if (MID(version(), 1, 1) LIKE 5, sleep(5), 1)
如果真的让MySQL查询sleep了5秒,说明MySQL版本为5.
讲完了常见SQL注入,那么如何来防范呢。其实PHP已经提供了一些优秀的预处理。
可以使用PDO或者mysqli*系列函数,对sql语句进行预编译,杜绝sql注入。
<?php
require_once('../conf/db.php');
$pdo = new PDO($dns, $user, $password);
// ... some logic codes
$sql = 'insert into user (name,address) values(:name,:address)';
$stmt = $pdo->prepare($sql);
$name = "freephp'hack";
$address= "CDC,china";
// 绑定参数
$stmt->bindParam(':name', $name);
$stmt->bindParam(':address', $address);
$stmt->execute();
if ($stmt->errorCode() == 0) {
echo "insert success";
} else {
print_r($stmt->errorInfo());
}
然而在默认情况下,使用PDO也不是让MySQL执行真正的预处理语句,一定要添加如下代码:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO:ERRMODE_EXCEPTION);
另外我们也应该对于用户的入参进行判断,比如有效性判断、类型判断,甚至加入一些有效类型数组来约束。
不要相信任何来自用户的数据,永远都留有一个悲观锁,即使你是一个命中注定的乐天派。
PHP安全之道3:常见漏洞和攻防的更多相关文章
- Linux环境下常见漏洞利用技术(培训ppt+实例+exp)
记得以前在drops写过一篇文章叫 linux常见漏洞利用技术实践 ,现在还可以找得到(https://woo.49.gs/static/drops/binary-6521.html), 不过当时开始 ...
- Windows XP与Windows 7系统常见漏洞
1.Windows XP系统常见漏洞 Windows XP系统常见的漏洞有UPNP服务漏洞.升级程序漏洞.帮助和支持中心漏洞.压缩文件夹漏洞.服务拒绝漏洞.Windows Media Player漏洞 ...
- Android常见漏洞
Android常见漏洞 漏洞名称: Log敏感信息泄露 漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露 修改建议: 建议禁止隐私信息的log 漏洞名称: web https校验错误忽略漏洞 漏 ...
- android WebView详解,常见漏洞详解和安全源码
这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 转载请注明出处:http://blog.csdn.net/se ...
- 详解Javaweb中常见漏洞的防御
上一篇给大家介绍了SpringMVC中常见的客户端数据输入点,这一篇给大家讲解下java中常见漏洞的防御方法. 0x01.sql注入 下面我们就用利用SpringMVC自带的数据库操作类jdbcTem ...
- Web中间件 - 常见漏洞总结
*文章来源:https://blog.egsec.cn/archives/472 *本文将主要说明:Web中间件常见漏洞的产生原因以及修复方案 什么是Web中间件? 百度百科是这样解释的:中间件是介于 ...
- 用PHP语言做网站常见漏洞有哪些?
第一:SQL注入漏洞 在进行网站开发的时候,程序员由于对用户输人数据缺乏全面判断或者过滤不严导致服务器执行一些恶意信息,比如用户信息查询等.黑客可以根据恶意程序返回的结果获取相应的信息.这就是所 ...
- java代码审计中的一些常见漏洞及其特征函数
文章来源:https://xz.aliyun.com/t/1633 最近在先知上看到之前有篇关于java代码审计的文章总结的蛮好,记录以下特征函数,方便查阅,同时自己也会将在平时代码审计过程中积累的函 ...
- 208道最常见的Java面试题整理(面试必备)
适宜阅读人群 需要面试的初/中/高级 java 程序员 想要查漏补缺的人 想要不断完善和扩充自己 java 技术栈的人 java 面试官 具体面试题 下面一起来看 208 道面试题,具体的内容. 一. ...
随机推荐
- 修改tomcat默认使用的jdk版本
1.windows平台 在csetclasspath.bat文件开头加上如下两句(指定JDK): set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_79 se ...
- 监控tomcat,自动启动
tomcatID=`ps -ef |grep tomcat |grep -v 'grep'|awk '{print $2}'` tomcatCount=`ps -ef|grep tomcat |gr ...
- Vim 自定义补全利器 Snippet
Vim Snippet 设置 本人是 vim 用户,可以说能不用 IDE 就不用 IDE. Snippet 是一种支持用户自定义补全的需求,在 vim 中,可以使用 UltiSnips 和 Vim-S ...
- 【PyTorch教程】P3. Python学习中的两大法宝函数(当然也可以用在PyTorch)
温馨提示:为了更好的教程体验,提供视频.阅读地址 Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9YjQvCBc ...
- JDBC报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone
报错原因:查阅资料发现这都是因为安装mysql的时候时区设置的不正确 mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用+8:00格式 解决方法: 1.修改MySQL的配置文件,MyS ...
- Matlab 在线使用 | 推荐
Matlab 在线使用 | 推荐
- JavaScript 弹出框:警告(alert)、确认(confirm)的简单写法
onclick="javascript:return window.confirm('message')"
- 区块链原理、设计与应用pdf电子版下载
链接:https://pan.baidu.com/s/1koShkDjEYOXxLOewZJU2Rw 提取码:8ycx 内容简介 · · · · · · 本书由专业区块链开发者撰写,是区块链开发起步 ...
- 微擎 manifest.xml
微擎 manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns= ...
- nyoj 82-迷宫寻宝(一) (多重BFS)
82-迷宫寻宝(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:5 难度:4 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...