万能密码
试想以下场景:
大熊: 哆啦A梦,静香的账号好不容易知道了,但是有密码不能登录,肿么办?
Dora: 没事,看我的—–”万能密码”,从口袋里面掏出了一个银色子弹~
那么在使用道具”万能密码”之前,我们先回想一下web中常见场景.(Login)
如果账号密码正确,就能成功进入. 不能就会失败.
那么”万能钥匙”如何使用呢? 如图 username 的 admin 后面多了一个单引号+空格+ ‘–’ +空格
然后发现居然也能提示 Success . 对比一下.这就是 SQL注入 !
SQL注入原理
全称 : SQL Injection
是一种常见的严重web漏洞攻击手段,攻击实施在前端,请求后台调用数据库的时候.利用sql语句的语法特性以及sql自带的一些函数,达到绕开权限或者获取敏感信息的效果.
就连 Zhihu 也曾被轻易的爆出大量db的信息. 这都是非常危险的.
下面对之前的例子进行说明.
实战利用
首先是从前端携带参数传入后台. usrname & passwd
然后后台接收是通过补货前台的参数, 在sql语句中进行拼接.
1
2mysql_query("select * from teacher where name = '$usrname' and passwd ='$passwd'");
//可以发现,上面的参数是通过字符串插入进来的. 下面是返回usrname 如果正常返回就表示登录成功那么sql注入的实现是什么呢,
由于mysql或者很多db提供挺多的查询数据库信息的语句,所以使用联合查询之后还能试探出很多信息.
这个部分后续补充.
下面演示再演示一下SQL注入可能包含的暴露其他信息的演示:
可以看到,通过利用sql中的union语句以及构造and 0=1 (思考:为什么要这样构造?)
我们可以构造一个函数去使用db查询语句,调取到数据库的关键信息跟关键字.归纳一下发现风险非常大.
补充:万能账号
补充万能密码是一种。 但是这种必须要知道某个关键用户或者管理员的账户。 那么如何在什么都不知情的情况下获得登录权限呢。 这里就要用到更上一层的万能账号了
1 | #正常的一个查询语句 |
如何防范
根本上说两个方法:
PreparedStatement(sql语句预编译),使用占位符? 而不是字符串拼接.(最佳,推荐)
需要熟悉java & PHP 下如何快速把原本sql改为占位符式sql!!
URL过滤,服务器端对恶意试探请求进行相关防范.
不过尽管有人说预编译sql语句,可以杜绝sql注入,但是其实还是有一些漏网之鱼,只不过可能没办法提权.
后续补充









