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 道面试题,具体的内容. 一. ...
随机推荐
- C语言I博客作业07
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-1/homework/9931 我在这个课程的目标 ...
- MAC配置JAVA环境变量
一.下载安装文件 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html jdk-8u144-macosx-x64. ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API
1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作 什么是REST REST一词最早是在2000年,由Roy Fielding在他的博士论文<Archit ...
- NOIP模拟 4
T1没开longlong T2忘了有向... T3是个好题,可以说将复杂度从N^2优化到NlogN是一个质的飞跃 考虑分治(要想出log可不就要分治么!(segtree也行 但我不会) 对于一个分治区 ...
- linux shell脚本语法笔记
1.&,&&,|,|| &:除了最后一个cmd,前面的cmd均已后台方式静默执行,执行结果显示在终端上,个别的cmd错误不影响整个命令的执行,全部的cmd同时执行 &a ...
- Uva 227-Puzzle 解题报告
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Windows对python文件加密
最近项目需要对部分python文件加密,调研了部分方法都觉得不可行,最后采用了将python转换成so文件.pyd文件的方法.so文件,为liunx下的动态链接库文件,在windows下为dll文件, ...
- 删除Linux的依赖库并进入救援模式恢复
删除Linux的依赖库并进入救援模式恢复 模拟一下依赖库文件被删,并进入救援模式恢复 系统:CentOS7 一.删除mv的依赖库文件 删除/lib64/libc.so.6 [root@centos7 ...
- 创建一个线程池(java)
private ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("billService-poo ...
- 创建基于OData的Web API - Knowledge Builder API, Part I:Business Scenario
在.NET Core 刚刚1.0 RC的时候,我就给OData团队创建过Issue让他们支持ASP.NET Core,然而没有任何有意义的答复. Roadmap for ASP.NET Core 1. ...