本文屬于i春秋原創文章現金獎勵計劃,未經允許嚴禁轉載。
介紹:
在access數據庫類型注入的時候,我們獲取不到列名(前提是有表名),一般會選擇使用偏移注入,但是這種注入方式往往借助的是個人的人品,且步驟繁瑣。本文中我們研究了一種新的注入技術讓“偏移注入不在需要人品”。在這里定義這種注入技術為:“移位溢注技術”。它適用于ACCESS和MySQL(任何版本)正文:我們先來看看普通的偏移注入步驟:1.判斷注入點2.order by 判斷長度3.判斷表名4.聯合查詢5.獲取表中列數:union select 1,2,3,4,..,* from TABLE6.開始偏移注入:TABLE as a inner join TABLE as b on a.id=b.id由于步驟6的方法過于需要人品值,且語句繁瑣,因此在這里,我們研究新的注入技術:首先來看看步驟6語句的整體意思:步驟6的語句,表示給TALBE取2個別名,然后分別用別名取查詢TALBE的內容(表a和表b);而on a.id = b.id 這樣的條件是為了滿足語法需求,實際并沒有作用,因為相同內容的表,相同字段內容一定相同。這時,我們再回過頭來看步驟5:由于聯合查詢中select后面添加數字的目的是為了讓聯合查詢返回接結果和網站正常查詢返回的結果的列數一致(不一致數據庫會報錯,頁面無法顯示),且*表示通配符,可以表示整個表格所有列;因此這里通過數字來占位,并使用*來替代TABLE中的所有列,使得聯合查詢可以完成,并推算出*的值。這時候我們繼續研究偏移注入的整體公式方法,發現即使使用多級偏移注入也需要一定的概率(人品值)才可以得到想要的結果,所以我們就嘗試研究新的方法能不能替換這種不固定概率的方法。現在我們重新整理一下SQL語句,從聯合查詢開始:1.原union語句:union select 1,2,3,..,p..,n from TABLE(p=頁面爆出的數字,可能有多個p1,p2..;n=原網站查詢的總列數;TALBE=我們獲得的表名;下面開始就使用上述字母的定義)2.新語句:union select 1,2,3,..,p-1,TABLE.*,p+k,..,n from TABLE where 字段名 = 字段內容 --在p的位置爆出TALBE表中第一個字段的內容(其他位置還可能爆出更多內容)(這里如果存在已知字段名可以使用,沒有就不用,一般id這個字段時存在的,可以使用id = 1來顯示第一行)union select 1,2,3,..,p-2,TABLE.*,p+k-1,..,n from TABLE where 字段名 = 字段內容--在p的位置爆出TALBE表中第二個字段的內容(其他位置還可能爆出更多內容)union select 1,2,3,..,p-3,TABLE.*,p+k-2,..,n from TABLE where 字段名 = 字段內容--在p的位置爆出TALBE表中第三個字段的內容(其他位置還可能爆出更多內容)注:這里一定是TALBE.*而不是*3.1 以此類推可以爆出TALBE的每一列內容。3.2 如果p<k則沒法爆出p+1列至k列的內容,如果n-p<k則無法爆出第1列至k-(n-p)列。原理:1.由原語句:union select 1,2,3,..,p..,n-k,* from TABLE 可以得出該聯合查詢的目的是構造和原網站相同列數的查詢結構,使得頁面上可以顯示對應的數字;這條語句相當于是做了兩次查詢并將它們的結果合并,第一次做了select 1,2,3,..,n-k from TALBE ,第二次做了select * from TALBE ,然后將它們的結果合并。這可以參考mysql的語句:select 1,2,3,4,5,admin.* from admin;在這里我們命名這種新注入技術為"移位溢注"。由此如果MYSQL小于5.0的情況下所具備的條件和ACCESS一樣,也可以使用此方法注入,如果是MYSQL大于5.0的版本,使用此方法可以省去獲得列名的步驟。
新聞熱點
疑難解答