寫sql跑
① 部分sql注入總結
本人ctf選手一名,在最近做練習時遇到了一些sql注入的題目,但是sql注入一直是我的弱項之一,所以寫一篇總結記錄一下最近學到的一些sql注入漏洞的利用。
在可以聯合查詢的題目中,一般會將資料庫查詢的數據回顯到首頁面中,這是聯合注入的前提。
適用於有回顯同時資料庫軟體版本是5.0以上的MYSQL資料庫,因為MYSQL會有一個系統資料庫information_schema, information_schema 用於存儲資料庫元數據(關於數據的數據),例如資料庫名、表名、列的數據類型、訪問許可權等
聯合注入的過程:
判斷注入點可以用and 1=1/and 1=2用於判斷注入點
當注入類型為數字型時返回頁面會不同,但都能正常執行。
sql注入通常為數字型注入和字元型注入:
1、數字型注入
數字型語句:
在這種情況下直接使用and 1=1/and 1=2是都可以正常執行的但是返回的界面是不一樣的
2、字元型注入
字元型語句:
字元型語句輸入我們的輸入會被一對單引號或這雙引號閉合起來。
所以如果我們同樣輸入and 1=1/and 1=2會發現回顯畫面是並無不同的。
在我們傳入and 1=1/and 1=2時語句變為
傳入的東西變成了字元串並不會被當做命令。
所以字元型的測試方法最簡單的就是加上單引號 ' ,出現報錯。
加上注釋符--後正常回顯界面。
這里還有的點就是sql語句的閉合也是有時候不同的,下面是一些常見的
這一步可以用到order by函數,order by 函數是對MySQL中查詢結果按照指定欄位名進行排序,除了指定字 段名還可以指定欄位的欄位進行排序,第一個查詢欄位為1,第二個為2,依次類推,所以可以利用order by就可以判斷列數。
以字元型注入為例:
在列數存在時會正常回顯
但是列數不存在時就會報錯
這步就說明了為什麼是聯合注入了,用到了UNION,UNION的作用是將兩個select查詢結果合並
但是程序在展示數據的時候通常只會取結果集的第一行數據,這就讓聯合注入有了利用的點。
當我們查詢的第一行是不存在的時候就會回顯第二行給我們。
講查詢的數據置為-1,那第一行的數據為空,第二行自然就變為了第一行
在這個基礎上進行注入
可以發現2,3都為可以利用的顯示點。
和前面一樣利用union select,加上group_concat()一次性顯示。
現在非常多的Web程序沒有正常的錯誤回顯,這樣就需要我們利用報錯注入的方式來進行SQL注入了
報錯注入的利用步驟和聯合注入一致,只是利用函數不同。
以updatexml為例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路徑(Xpath格式)
new_xml: 更新後的內容
此函數用來更新選定XML片段的內容,將XML標記的給定片段的單個部分替換為 xml_target 新的XML片段 new_xml ,然後返回更改的XML。xml_target替換的部分 與xpath_expr 用戶提供的XPath表達式匹配。
這個函數當xpath路徑錯誤時就會報錯,而且會將路徑內容返回,這就能在報錯內容中看到我們想要的內容。
而且以~開頭的內容不是xml格式的語法,那就可以用concat函數拼接~使其報錯,當然只要是不符合格式的都可以使其報錯。
[極客大挑戰 2019]HardSQL
登錄界面嘗試注入,測試後發現是單引號字元型注入,且對union和空格進行了過濾,不能用到聯合注入,但是有錯誤信息回顯,說明可以使用報錯注入。
利用updatexml函數的報錯原理進行注入在路徑處利用concat函數拼接~和我們的注入語句
發現xpath錯誤並執行sql語句將錯誤返回。
在進行爆表這一步發現了等號也被過濾,但是可以用到like代替等號。
爆欄位
爆數據
這里就出現了問題flag是不完整的,因為updatexml能查詢字元串的最大長度為32,所以這里要用到left函數和right函數進行讀取
報錯注入有很多函數可以用不止updatexml一種,以下三種也是常用函數:
堆疊注入就是多條語句一同執行。
原理就是mysql_multi_query() 支持多條sql語句同時執行,用;分隔,成堆的執行sql語句。
比如
在許可權足夠的情況下甚至可以對資料庫進行增刪改查。但是堆疊注入的限制是很大的。但是與union聯合執行不同的是它可以同時執行無數條語句而且是任何sql語句。而union執行的語句是有限的。
[強網杯 2019]隨便注
判斷完注入類型後嘗試聯合注入,發現select被過濾,且正則不區分大小寫過濾。
那麼就用堆疊注入,使用show就可以不用select了。
接下去獲取表信息和欄位信息
那一串數字十分可疑大概率flag就在裡面,查看一下
這里的表名要加上反單引號,是資料庫的引用符。
發現flag,但是沒辦法直接讀取。再讀取words,發現裡面有個id欄位,猜測資料庫語句為
結合1'or 1=1#可以讀取全部數據可以利用改名的方法把修改1919810931114514為words,flag修改為id,就可以把flag讀取了。
最終payload:
盲注需要掌握的幾個函數
在網頁屏蔽了錯誤信息時就只能通過網頁返回True或者False判斷,本質上是一種暴力破解,這就是布爾盲注的利用點。
首先,判斷注入點和注入類型是一樣的。
但是盲注沒有判斷列數這一步和判斷顯示位這兩步,這是和可回顯注入的不同。
判斷完注入類型後就要判斷資料庫的長度,這里就用到了length函數。
以[WUSTCTF2020]顏值成績查詢為例
輸入參數後,發現url處有個get傳入的stunum
然後用到length函數測試是否有注入點。
發現頁面有明顯變化
將傳入變為
頁面回顯此學生不存在
那麼就可以得出資料庫名長度為3
測試發現過濾了空格
然後就是要查資料庫名了,這里有兩種方法
一、只用substr函數,直接對比
這種方法在寫腳本時可以用於直接遍歷。
二、加上ascii函數
這個payload在寫腳本時直接遍歷同樣可以,也可用於二分法查找,二分法速度更快。
接下來的步驟就和聯合注入一樣,只不過使用substr函數一個一個截取字元逐個判斷。但是這種盲注手工一個一個注十分麻煩所以要用到腳本。
直接遍歷腳本
二分法腳本
時間盲注用於代碼存在sql注入漏洞,然而頁面既不會回顯數據,也不會回顯錯誤信息
語句執行後也不提示真假,我們不能通過頁面的內容來判斷
所以有布爾盲注就必有時間盲注,但有時間盲注不一定有布爾盲注
時間盲注主要是利用sleep函數讓網頁的響應時間不同從而實現注入。
sql-lab-less8:
無論輸入什麼都只會回顯一個you are in...,這就是時間盲注的特點。
當正常輸入?id=1時時間為11毫秒
判斷為單引號字元型注入後,插入sleep語句
明顯發現響應時間為3053毫秒。
利用時間的不同就可以利用腳本跑出資料庫,後續步驟和布爾盲注一致。
爆庫
爆表
爆欄位
腳本
在進行SQL注入時,發現union,and,or被完全過濾掉了,就可以考慮使用異或注入
什麼是異或呢
異或是一種邏輯運算,運演算法則簡言之就是:兩個條件相同(同真或同假)即為假(0),兩個條件不同即為真(1),null與任何條件做異或運算都為null,如果從數學的角度理解就是,空集與任何集合的交集都為空
即 1^1=0,0^0=0,1^0=1
利用這個原理可以在union,and,or都被過濾的情況下實現注入
[極客大挑戰 2019]FinalSQL
給了五個選項但是都沒什麼用,在點擊後都會在url處出現?id。
而且union,and,or都被過濾
測試發現?id=1^1會報錯
但是?id=1^0會返回?id=1的頁面,這就是前面說的原理,當1^0時是等於1的所以返回?id=1的頁面。
根據原理寫出payload,進而寫出腳本。
爆庫
爆表
爆欄位
據此可以寫出基於異或的布爾盲注腳本
實驗推薦:課程:SQL注入初級(合天網安實驗室)
② SqlServer怎麼定時跑一段SQL語句
1、請把這段SQL語句寫成一個存儲過程,然後需要在B上面開啟SQLServerAgent服務,如下圖:
③ 數據分析師日常工作是什麼
(1)寫SQL 腳本:俗稱「跑數據」。leader要一組 季度數據/月數據/周數據 ,寫一段或者N段SQL把數據跑出來。一般是臨時性需求,不過當發現默默地演變成一個常規性需求時,最好直接封裝SP(存儲過程)了……每次跑一下方便省事。這項工作內容需要的技能點有:資料庫,SQL
(2)數據分析項目前中期:這個是耗時很長很麻煩的部分。前期是基礎數據的處理清洗,基礎匯總聚合,然後設計監測指標,指標的設計不僅僅是數學分析,更多需要跑業務需求方那邊了解,畢竟最終目的是要讓別人用,提升效率,不是為了凸顯模型高大上。所有需要的數據都有了之後,開始建立業務模型(數學模型),整個建模的過程也是反復探索數據的過程,在一定數據量的情況下,初期的建模應用起來一定會這種問題那種問題balabala煩死人……以後邊應用邊調整優化。技能點:資料庫,SQL,excel,R語言,數理統計,數據挖掘,業務知識。
(3)兼職產品經理:業務模型完了後,就有了指標結果。把數據落地到資料庫中。然後接下來需要找開發幫你做可視化站點。作為數據分析師我是最了解這個項目 邏輯流程、核心演算法、業務應用的。找開發幫你做可視化站點:曲線圖啊 柱狀圖啊 餅圖啊 balabala 讓別人一眼就能看到指標的整體狀況。技能點:邏輯思維,流程規劃,數據可視化,一定的開發知識(方便和開發溝通),表達能力力和表情。
(4)模型和指標正式應用起來自後:收集業務部的反饋,不停的跟他們溝通郵件,不停地優化模型,數據表。以及給業務部一些特定需求的分析評估報告(臨時性需求)。技能點:邏輯思維,表達能力
(5)個人學習:有時候會遇到等待別人工作進度的情況,比如別人的上一批數據沒出來,你完全沒法工作。那就上網或者看書 學習知識。數理統計和數據挖掘博大精深,如何能應用得好,產生最高性價比更是一門學問啦。多了解些總是沒壞處的。
(6)大數據部分:涉及到」大數據「已經不是我個人工作內容部分了,而是整組的工作內容。具體需要有專門比較懂hadoop和spark的人負責在上面跑數據,寫最終實現代碼。我們組里的分工大概就是:數據分析師,數據工程師,(半個產品經理),有人身兼三種,有人只愛專精。技能點:無特定加點法則,團隊加點。
④ SQL中累計求和與滑動求和函數sum() over()用法
在SQL中,sum()函數的擴展功能——窗口函數sum() over()提供了三種主要用法:分組求和、累計求和和滑動求和。讓我們通過實例來理解這些場景的實現方式。
首先,以數據表dws_js_team_gmv為例,包含團隊名、月份和成交額欄位。我們來看三種求和需求的SQL代碼:
1. 要求是計算每個銷售團隊的年累計成交額及其對累計值的貢獻佔比,這可以通過分組求和並保留當前行數實現,SQL代碼如下:
SQL邏輯:
SQL跑數結果:
2. 對於逐月累計業績,從1月開始,同樣需要分組求和並保留當前行,代碼如下:
SQL邏輯:
SQL跑數結果:
3. 接下來是近3個月的累計業績(包括統計月)。這里涉及到滑動求和,用window函數over()設置滑動范圍,例如范圍從當前行前2行到當前行,代碼示例:
SQL邏輯:
對於不包含統計月的近3個月累計業績,有三種處理方法:
① 通過減去統計月的值,計算近4個月的滑動求和:range between 2 preceding and 0 following 或 2 preceding and current row
② 調整滑動區間為3個前一月到前兩個前一月:range between 3 preceding and 1 preceding
③ 或者調整為3個前一月到後一個前一月:range between 3 preceding and -1 following
這些SQL代碼展示了sum() over()函數在不同場景下的應用,幫助我們靈活處理累計和滑動求和需求。