文章标题:SQL注入万能密码原理


【*】发布时间:2020 年 02 月 22 日

原理

如果你对SQL语法足够的熟悉的情况下,你能很轻松的明白其原理: 让其永真即可 ( 即通过验证 )

假设 PHP 用户登录的关键代码是这么写的: 服务器本地已经建立了一个数据库,用户名叫做 sqlusr ,密码为 sqlpsd ,用户yyy中有一个数据库sss,数据库sss中有一个数据库表ttt,数据库表中有三列,分别为aaa、bbb、ccc

/*连接数据库*/
$cont = mysql_connect("localhost","sqlusr","sqlpsd");
mysql_select_db("user", $cont);

/*用户登录关键代码*/
$usr = $_POST['username'];
$pwd = $_POST['password'];
$sql = "SELECT * FROM user WHERE name = '$usr' AND password = '$pwd'";
mysql_query($sql);

这里, $usr 表示用户名, $pwd 表示密码, user 则是用户表,假设这张 user 表里有这么一个具有管理权限的用户 admin ,且是在网站具有管理员权限; 这个时候,我们在登录框里输入 admin 然后在密码框里输入如下内容:

1' or 1=1#

然后语句就变成了这样:

SELECT * FROM user WHERE name = 'admin' AND password = '1' or 1=1#'

这里 # 号起到的作用便就是注释掉后面的sql语句,此时你会发现这条语句变成了永真,数据库执行时,便就绕过了登录密码验证,这就是一个简单的单字符注入.

注入类型的判断

数字型

SELECT * FROM users WHERE id = $id

单字符型

SELECT * FROM users WHERE id = '$id'

双字符型

SELECT * FROM users WHERE id = "$id"

如果在实际测试当中成功使用万能密码登录了目标用户则证明此处是一个注入点,你可以通过手工构造任意 sql 语句去查询数据库里你想要的任何内容!

union 的利用

union 用于合并两个或更多个 select 的结果集,所以我们可以使用 union 去执行自己想要执行的任何内容.

在漏洞级别中SQL注入属于高危漏洞,所以开发者需要警惕,安全人士可以不懂开发,但是开发一定要去懂安全!