Web安全测试学习笔记 - SQL注入-1

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

 

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

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

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

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

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

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

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

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

而后尝试输入:2' or '1'='1,对应sql以下:blog

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

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

 

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

 

一点点感悟:

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

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

 

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

相关文章
相关标签/搜索