SQL注入的定义网上很多,作为一个初学者,我对SQL注入的理解是这样的:网站应用一般都有后台数据库(不论是关系型还是非关系型),用户在网站上的绝大部分操作,最终都会跟数据库交互(也就是执行一串SQL语句)。既然最终是执行一串SQL语句,那攻击者只要猜到了这串SQL语句从前端输入到最后执行是如何拼接的,就可以拼接自己的恶意SQL语句,来非法获取数据。所以,要学习SQL注入,首先,你得会SQL~O(∩_∩)O~

我用DVWA来练习SQL注入,先将安全等级设置为low,如下:

进入SQL Injection页面,如下。作为一个初学者,刚进入这个页面的时候,我是懵逼的...>_<...

页面就一个输入框和一个按钮,看上去是需要输入一个数字,我尝试输入了数字2,页面返回了一些信息,同时URL后面多了"?id=2&Submit=Submit#":

从这里看出,参数名称为id,参数值为数字。从返回的信息来看,应该是查询了数据库用户表里用户id为2的那条数据的其中两个字段,所以最终执行的sql应该类似:

select Firstname,Surname from user表 where id =2

既然参数是从前端传进去的,那么有可能在拼接参数的过程中还会带有引号,因此输入2',然后进入了报错页面:

从报错可以看出,后台使用的数据库类型是MySQL,传入id的值时使用了单引号(可以再试试输入双引号,不会报错),所以最终执行的sql应该是:

select Firstname,Surname from user表 where id ='2'

然后尝试输入:2' or '1'='1,对应sql如下:

select Firstname,Surname from user表 where id ='2' or '1'='1'

通过1=1将where的过滤条件变为真,结果返回了用户表中所有行,注入成功。

怎样才算SQL注入成功了呢?个人理解是:只要违背了程序原本的意愿都算攻击成功,比如:拿到了更多数据,越权拿到数据,拿到敏感数据,拿到对方服务器信息等等。该页面的本意是根据id一次拿一行数据,通过sql拼接我拿到了表中的所有行。

一点点感悟:

1. 对输入进行过滤

2. 进行异常和错误信息处理很重要,不能直接将数据库异常/错误抛出去

3. 避免将重要参数暴露在URL中,可以使用post请求,将参数放在body中传输

如需转载,请注明出处,这是对他人劳动成果的尊重~

最新文章

  1. vue-router2.0 组件之间传参及获取动态参数
  2. SQL SERVER 得到汉字首字母函数四版全集 --【叶子】
  3. 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
  4. PHP文件相关的操作函数——文件操作
  5. HDU 5769 Substring 后缀数组
  6. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多
  7. oracle断电重启之ORA-01033和ORA-01172
  8. 镜像渐变-radio-gradient
  9. GL_GL系列 - 日记账处理管理分析(案例)
  10. K短路
  11. Linux编程之《进程/线程绑定CPU》
  12. 我的Shell + VIM配置
  13. C#委托(Delegate)学习日记
  14. MySQL ID排序乱了的解决办法
  15. Hyperledger Fabric、Corda和以太坊对比
  16. C#类型(一)
  17. 使用Docker方式运行Mysql(MariaDB)
  18. loadrunner&#160;运行脚本-Run-time&#160;Settings-Browser&#160;Enmulation设置详解
  19. Centos7.5 防火墙设置
  20. Anaconda 3中配置OpenCV

热门文章

  1. Linux三剑客之sed流编辑器
  2. 使用 Vue + TypeScript 时项目中常用的装饰器
  3. django甜甜的弹窗
  4. Linux下如何编辑pdf文件目录
  5. C#线程学习笔记十:async &amp; await入门三
  6. SpringCloud-使用路由网关统一访问接口(附代码下载)
  7. Castle DynamicProxy基本用法(AOP)
  8. SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
  9. pycharm安装第三方包问题解决
  10. ASP.NET Core 2.x 到 3.1 迁移指南