SQL注入基础入门

Posted 合天智汇

tags:

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

SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。


SQL注入原理



SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

    根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。


SQL注入危害



  • 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。

  • 网页篡改:通过操作数据库对特定网页进行篡改。

  • 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。

  • 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。

  • 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。

  • 破坏硬盘数据,瘫痪全系统。


SQL注入成因





用户开启浏览器并连接http://www.xxx.com。位于逻辑层的Web服务器从文件系统中加载脚本将其传递给脚本引擎,脚本引擎负责解析并执行脚本。


脚本使用数据库连接程序打开存储层连接并对数据库执行SQL语句。数据库将数据返回给数据库连接程序,后者将其传递给逻辑层的脚本引擎。逻辑层再将WEB页面以html格式返回给表示层的用户的浏览器之前,先执行相关的应用或业务逻辑规则。用户的WEB浏览器呈现HTML并借助代码的图形化表示展现

给用户。整个过程数秒内完成,并且对用户是透明的。


简单来说,WEB浏览器(表示层)向中间层(逻辑层)发送请求,中间层通过查询更新数据库(存储层)响应请求。


从用户请求到在数据库中执行SQL语句,服务器未经过任何过滤校验,就把用户的请求直接在数据库中执行,导致数据库内的数据发生泄漏、更改等。


SQL注入在哪里



· get

  · post

  · 数据包头部注入

  · cookie注入

  · 搜索注入

  · ......等

  1.任何客户端可控,传递到服务器的变量;

  2.必须带有参数传递,参数值带入到数据库查询;

  3.服务器没有进行过滤或过滤的不严格。


SQL注入的分类



根据注入语法分类:

    · Error-based SQL injection (报错型注入)

    · Boolean-based blind SQL injection (布尔型注入)

    · UNION query SQL injection (可联合查询注入)

    · Stacked queries SQL injection (可多语句查询注入)sql server中使用

    · Time-based blind SQL injection (基于时间注入)

  

根据SQL数据类型分类:

    · 整形注入

    · 字符串类型注入

    · 搜索类型注入


判断是否存在注入



and 1=1 / and 1=2 根据回显页面不同(整型)

  单引号判断 ' 显示数据库错误信息(整型,字符串类型)

   是否报错

  随机输入判断

  -1 / +1 回显上个页面(整型)

  and sleep(5) 返回时间是否变化


判断注入类型



布尔类型:

当一个页面,存在注入,但是没有显示位,而且没有数据库出错信息,只能通过页面返回正常/不正常进行判断,即为布尔型注入

优点:不需要显示位,不需要代码输出mysql_error()信息

缺点:速度慢


 报错注入:


因为传递参数不正常引起数据库执行语句发生错误,脚本输出错误信息,即为报错注入


 联合查询注入:


页面根据参数值改变而改变,即有显示位的条件下,没有过滤单引号、双引号等特殊字符,及SQL命令;可以对SQL语句截断,使用UNION 添加


查询语句来进行注入:


UNION两边列的数量相同,可使用order by 猜测获取列的数量。


基于时间的注入:


当一个页面,存在注入,但是没有显示位,而且没有数据库出错信息,页面的返回信息不会改变,可以在布尔语句上使用sleep(),猜解获取信息


构造注入语句: 


  • exists()

  • ascii()

  • substr()


函数的使用


  • select exists(select user());
  • select substr((select user()), 1, 1);
  • select substr((select user()), 2, 1);
  • select ascii(“a”);
  • select ascii(“abc");
  • select ascii(substr((select user()), 3, 1));
  • select ascii(substr((select user()), 3, 1)) > 100;
  • select ascii(substr((select user()), 3, 1)) > 120;

  

在mysql5.0版本之后,就存在一个information_schema数据库,可以在该库的tables表和columns表中获取脚本连接数据库的账号-可以控制的数据


库的结构


举例: 


• ?id=1' and exists(select * from information_schema.tables) --+

• ?id=1' and (select length(version()))=6 --+ #判断 version()返回字符串长度

• ?id=1' and (select count(distinct+table_schema) from information_schema.tables) > 10 --+ #判断有多少个数据库

• ?id=1' and (select ascii(substr((select distinct table_schema from information_schema.tables limit 0,1), 1 ,1))) > 100 --+ 

#判断第一个库的第一个字符


SQL注入基础入门
SQL注入基础入门

推荐实验




点击阅读原文,收获技能



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

PHP代码审计入门(SQL注入漏洞挖掘基础)

基础Web漏洞-SQL注入入门(手工注入篇)

SQL注入从入门到实践

手工注入和BurpSuite入门-web安全

WEB安全基础入门—操作系统命令注入(shell 注入)

小迪网安笔记一:基础入门