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 道面试题,具体的内容. 一. ...
随机推荐
- Bash shell类型
登录shell(需要密码) 正常通过某一个终端来登录,需要输入用户名和密码. 使用su - username 使用su -l username 非登录shell(不需要密码) su userna ...
- MySQL字符集与排序规则总结
字符集与排序规则概念 在数据库当中都有字符集和排序规则的概念, 很多开发人员甚至包括有些DBA都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...
- makefile中":="和“=”的区别
在makefile中,经常能看到这种赋值方式: MyNumber := 这种方式洋名叫做expansion assignment, 翻译过来叫扩展赋值, 我一般就叫冒号等号.这位同学就问了,那么它和普 ...
- NOIP模拟 23
曾经有一段真挚的AK摆在skyh面前,但他一直意淫自己AK导致没有AK. 如果非要把这AK加一个期限的话,skyh一辈子都AK不了了. 论爆零选手的爆零原因 我说T3想到了能AC的思路但是爆零了有人同 ...
- postman发送json参数到后端controller报错415的解决方案
警告 [http-nio-8080-exec-9] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.l ...
- 游戏辅助外gua篇:如何Dump内存获得游戏的辅助
转载请标明出处: https://dujinyang.blog.csdn.net/article/category/9267855 本文出自:[奥特曼超人的博客] 本篇邀请了 "阿七&quo ...
- 数据结构--树链剖分准备之LCA
有关LCA的模板题 传送门 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和 ...
- 使用requests实现人人网登录,并做cookie维持
import requests import re,time s = requests.Session() def doLogin(): login_url = 'http://www.renren. ...
- ESP8266 智能配网 断电重连
ESP8266 智能配网 断电重连 #include <ESP8266WiFi.h> bool autoConfig() { WiFi.begin(); for (int i = 0; i ...
- Mybatis 关联对象不能输出的解决办法
Mybatis 关联对象不能输出的解决办法 1.如图所示,现在进行查询的时候并没有得到来自另一张表address项 2.我们进行如下配置: (1).在mybatis-config.xml 文件中配置, ...