SQL注入

SQL注入攻击的核心在于让Web服务器执行攻击者期望的SQL语句,以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等操作,达到其邪恶的目的。

而如何让Web服务器执行攻击者的SQL语句呢?SQL注入的常规套路在于将SQL语句放置于Form表单或请求参数之中提交到后端服务器,后端服务器如果未做输入安全校验,直接将变量取出进行数据库查询,则极易中招。

 

比如在一个输入用户id来获取用户信息的输入框中:输入“1%20or%201=1”

对于一个根据用户ID获取用户信息的接口,后端的SQL语句一般是这样:

select name,[...] from t_user whereid=$id

其中,$id就是前端提交的用户id,而如果前端的请求是这样:

GET xx/userinfo?id=1%20or%201=1

其中请求参数id转义后就是1 or 1=1,如果后端不做安全过滤,直接提交数据库查询,SQL语句就变成了:

select name,[...] from t_user whereid=1or1=1

其结果是把用户表中的所有数据全部查出,达到了黑客泄露数据的目的。

 

比如在输入用户名和密码的登录页面,在用户名输入框中输入“admin’or 1=1 #

登陆时调用接口/user/login/加上username,password参数,首先连接数据库,然后后台对请求参数中携带的用户名、密码进行参数校验,即sql的查询过程

假设正确的用户名和密码为admin和123456,输入正确的用户名和密码,提交,相当于调用了以下SQL语句

SELECT * FROM user WHERE username=‘admin’ AND password = ‘123456’

Sql中,会将#号及以后的字符串当作注释处理,如果我们使用[’or 1=1 #]作为用户名参数,那么服务器端构建的wql语句就如下

Select * form users where username=’ ’ or 1=1 # ‘and password = ‘123456’

而—或#会忽略后面的语句,因此上面的sql也等价于

Select * form users where username=’ ‘ or 1=1

而1=1属于常等型条件,因此这个sql便成为了如下,查询出所有的登录用户

Select * from users

其实上面的sql注入只是在参数层面做了手脚,如果是引入了一些功能性的sql那就更危险了,比如上面的登录接口,如果用户名使用这个or 1=1; delete * from users; # 那么;之后相当于是另外一条新的sql,这个sql是删除全表,是非常危险的操作,因此注入这种还是需要特别注意的。

 

posted @ 2022-04-19 10:39  琴声悠悠-悠悠琴声  阅读(148)  评论(0编辑  收藏  举报