滲透攻防Web篇-SQL注入攻擊初級(jí)

來源前硫;http://bbs.ichunqiu.com/thread-9518-1-1.html?from=ch

作者:zusheng

時(shí)間:2016年8月3日 12:11:50

社區(qū):i春秋

前言

不管用什么語言編寫的Web應(yīng)用杖挣,它們都用一個(gè)共同點(diǎn),具有交互性并且多數(shù)是數(shù)據(jù)庫驅(qū)動(dòng)塘雳。在網(wǎng)絡(luò)中陆盘,數(shù)據(jù)庫驅(qū)動(dòng)的Web應(yīng)用隨處可見,由此而存在的SQL注入是影響企業(yè)運(yùn)營(yíng)且最具破壞性的漏洞之一败明,這里我想問隘马,我們真的了解SQL注入嗎?看完本篇文章希望能讓你更加深刻的認(rèn)識(shí)SQL注入肩刃。

目錄

第一節(jié) 注入攻擊原理及自己編寫注入點(diǎn)

1.1祟霍、什么是SQL?

1.2盈包、什么是SQL注入沸呐?

1.3、SQL注入是怎么樣產(chǎn)生的呢燥?

1.4崭添、編寫注入點(diǎn)

第二節(jié) 尋找及確認(rèn)SQL注入

2.1、推理測(cè)試法

2.2叛氨、and大法和or大法

2.3呼渣、加法和減法

正文

第一節(jié) 注入攻擊原理及自己編寫注入點(diǎn)

1.1、什么是SQL寞埠?

SQL 是一門 ANSI 的標(biāo)準(zhǔn)計(jì)算機(jī)語言屁置,用來訪問和操作數(shù)據(jù)庫系統(tǒng)。SQL 語句用于取回和更新數(shù)據(jù)庫中的數(shù)據(jù)仁连。SQL 可與數(shù)據(jù)庫程序協(xié)同工作蓝角,比如 MS Access、DB2饭冬、Informix使鹅、MS SQL Server、Oracle昌抠、Sybase 以及其他數(shù)據(jù)庫系統(tǒng)患朱。

1.2、什么是SQL注入炊苫?

看起來很復(fù)雜裁厅,其實(shí)很簡(jiǎn)單就能解釋,SQL注入就是一種通過操作輸入來修改后臺(tái)SQL語句達(dá)到代碼執(zhí)行進(jìn)行攻擊目的的技術(shù)劝评。

1.3姐直、SQL注入是怎么樣產(chǎn)生的?

構(gòu)造動(dòng)態(tài)字符串是一種編程技術(shù)蒋畜,它允許開發(fā)人員在運(yùn)行過程中動(dòng)態(tài)構(gòu)造SQL語句声畏。開發(fā)人員可以使用動(dòng)態(tài)SQL來創(chuàng)建通用、靈活的應(yīng)用。動(dòng)態(tài)SQL語句是在執(zhí)行過程中構(gòu)造的插龄,它根據(jù)不同的條件產(chǎn)生不同的SQL語句愿棋。當(dāng)開發(fā)人員在運(yùn)行過程中需要根據(jù)不同的查詢標(biāo)準(zhǔn)來決定提取什么字段(如SELECT語句),或者根據(jù)不同的條件來選擇不同的查詢表時(shí)均牢,動(dòng)態(tài)構(gòu)造SQL語句會(huì)非常有用糠雨。

在PHP中動(dòng)態(tài)構(gòu)造SQL語句字符串:

[PHP]純文本查看復(fù)制代碼

?

1

$query="SELECT * FROM users WHERE username = ".$_GET["ichunqiu"];

看上面代碼我們可以控制輸入?yún)?shù)ichunqiu,修改所要執(zhí)行SQL語句徘跪,達(dá)到攻擊的目的甘邀。

1.4、編寫注入點(diǎn)

為了照顧一下新人垮庐,這里先介紹一下涉及到的基礎(chǔ)知識(shí):

[SQL]純文本查看復(fù)制代碼

?

1

2

3SQLSELECT語法

SELECT列名稱FROM表名稱

符號(hào) * 取代列的名稱是選取所有列

[SQL]純文本查看復(fù)制代碼

?

1

2

3

4WHERE子句

如需有條件地從表中選取數(shù)據(jù)松邪,可將WHERE子句添加到SELECT語句。

語法

SELECT列名稱FROM表名稱WHERE列 運(yùn)算符 值

下面的運(yùn)算符可在 WHERE 子句中使用:

了解了以上基礎(chǔ)知識(shí)就讓我們來自己編寫注入點(diǎn)把哨查。

第一步:我們使用if語句來先判斷一下變量是否初始化

[PHP]純文本查看復(fù)制代碼

?

1

2

3

4

5

if(isset($_GET["ichunqiu"])){

}

?>

第二步:在if語句里面逗抑,我們連接數(shù)據(jù)庫。在PHP中寒亥,這個(gè)任務(wù)通過 mysql_connect() 函數(shù)完成邮府。

[PHP]純文本查看復(fù)制代碼

?

1

2

3

4mysql_connect(servername,username,password);

servername??????? 可選。規(guī)定要連接的服務(wù)器溉奕。默認(rèn)是"localhost:3306"褂傀。

username??????? 可選。規(guī)定登錄所使用的用戶名加勤。默認(rèn)值是擁有服務(wù)器進(jìn)程的用戶的名稱紊服。

password??????? 可選。規(guī)定登錄所用的密碼胸竞。默認(rèn)是""。

第三步:連接成功后参萄,我們需要選擇一個(gè)數(shù)據(jù)庫卫枝。

[PHP]純文本查看復(fù)制代碼

?

1

2

3mysql_select_db(database,connection)

database??????? 必需。規(guī)定要選擇的數(shù)據(jù)庫讹挎。

connection??????? 可選校赤。規(guī)定 MySQL 連接。如果未指定筒溃,則使用上一個(gè)連接马篮。

第四步:選擇完數(shù)據(jù)庫,我們需要執(zhí)行一條 MySQL 查詢怜奖。

[PHP]純文本查看復(fù)制代碼

?

1

2

3mysql_query(query,connection)

query??????? 必需浑测。規(guī)定要發(fā)送的 SQL 查詢。注釋:查詢字符串不應(yīng)以分號(hào)結(jié)束。

connection??????? 可選迁央。規(guī)定 SQL 連接標(biāo)識(shí)符掷匠。如果未規(guī)定,則使用上一個(gè)打開的連接岖圈。

第五步:執(zhí)行完查詢讹语,我們?cè)賹?duì)結(jié)果進(jìn)行處理

[AppleScript]純文本查看復(fù)制代碼

?

1

2

3

4

5

6

7mysql_fetch_array(data,array_type)

data可選。規(guī)定要使用的數(shù)據(jù)指針蜂科。該數(shù)據(jù)指針是 mysql_query()函數(shù)產(chǎn)生的結(jié)果顽决。

array_type

可選。規(guī)定返回哪種結(jié)果导匣〔挪ぃ可能的值:

MYSQL_ASSOC-關(guān)聯(lián)數(shù)組

MYSQL_NUM-數(shù)字?jǐn)?shù)組

MYSQL_BOTH-默認(rèn)。同時(shí)產(chǎn)生關(guān)聯(lián)和數(shù)字?jǐn)?shù)組

題外話:我們使用echo將執(zhí)行的SQL語句輸出逐抑,方便我們查看后臺(tái)執(zhí)行了什么語句鸠儿。

[PHP]純文本查看復(fù)制代碼

?

1

echo$querry

最終代碼如下:

[PHP]純文本查看復(fù)制代碼

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26if(isset($_GET["id"])){

$con= mysql_connect("127.0.0.1:3306","root","root");

if(!$con)

{

die('Could not connect: '. mysql_error());

}

mysql_select_db("ichunqiu",$con);

$querry="select * from users where id = ".$_GET['id'];

$sql= mysql_query($querry,$con);

$result= mysql_fetch_array($sql);

echo"";

id

username

echo"";

".$result['id']."

".$result['username']."

echo"";

echo"";

mysql_close($con);

echo$querry;

}

?>

MySQL數(shù)據(jù)庫實(shí)驗(yàn)環(huán)境配置:

代碼層工作已經(jīng)做好,但是在數(shù)據(jù)庫里面厕氨,我們還沒有ichunqiu這個(gè)數(shù)據(jù)庫啊进每,接下來我就帶大家一步步創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表命斧,創(chuàng)建列田晚,插入數(shù)據(jù)。

第一步:創(chuàng)建數(shù)據(jù)庫

第二步:創(chuàng)建表users和列id,username,password

第三步:我們插入幾條數(shù)據(jù)

同樣的道理国葬,大家多插幾條數(shù)據(jù)贤徒。到此我們整個(gè)任務(wù)就完成了。

最終成果如下:

第二節(jié) 尋找及確認(rèn)SQL注入

2.1汇四、推理測(cè)試法

尋找SQL注入漏洞有一種很簡(jiǎn)單的方法接奈,就是通過發(fā)送特殊的數(shù)據(jù)來觸發(fā)異常。

首先我們需要了解數(shù)據(jù)是通過什么方式進(jìn)行輸入通孽,這里我總結(jié)了三個(gè):

GET請(qǐng)求:該請(qǐng)求在URL中發(fā)送參數(shù)序宦。

POST請(qǐng)求:數(shù)據(jù)被包含在請(qǐng)求體中。

其他注入型數(shù)據(jù):HTTP請(qǐng)求的其他內(nèi)容也可能會(huì)觸發(fā)SQL注入漏洞背苦。

了解完數(shù)據(jù)的輸入方式互捌,我們接下來再學(xué)習(xí)數(shù)據(jù)庫錯(cuò)誤。這里我們以MySQL為例行剂,其它的請(qǐng)大家自行學(xué)習(xí)咯秕噪。

我們現(xiàn)在參數(shù)后面加個(gè)單引號(hào),如下圖:

sql語句最終變?yōu)?/p>

[SQL]純文本查看復(fù)制代碼

?

1

select*fromuserswhereid = 1'

執(zhí)行失敗厚宰,所以mysql_query()函數(shù)會(huì)返回一個(gè)布爾值腌巾,在下行代碼中mysql_fetch_array($sql)將執(zhí)行失敗,并且PHP會(huì)顯示一條警告信息,告訴我們mysql_fetch_array()的第一個(gè)參數(shù)必須是個(gè)資源壤躲,而代碼在實(shí)際運(yùn)行中城菊,給出的參數(shù)值卻是一個(gè)布爾值。

我們修改代碼在

[PHP]純文本查看復(fù)制代碼

?

1

2$sql= mysql_query($querry,$con);下一行加上

var_dump($sql);

可以發(fā)現(xiàn):

為了更好的了解MySQL錯(cuò)誤碉克,我們?cè)?/p>

[PHP]純文本查看復(fù)制代碼

?

1

$sql= mysql_query($querry,$con);

加上

[PHP]純文本查看復(fù)制代碼

?

1

2

3

4if(!$sql)

{

die('

error:'.mysql_error().'

');

}

這樣當(dāng)應(yīng)用捕獲到數(shù)據(jù)庫錯(cuò)誤且SQL查詢失敗時(shí)凌唬,就會(huì)返回錯(cuò)誤信息:(我們?cè)趨?shù)中添加單引號(hào)返回的錯(cuò)誤信息)

[SQL]純文本查看復(fù)制代碼

?

1

error:You have an errorinyour SQL syntax;checkthe manual that correspondstoyour MySQL server versionfortherightsyntaxtouse near'''atline 1

然后借助這些錯(cuò)誤,我們這可以推斷應(yīng)該存在SQL注入漏麦。還有其他數(shù)據(jù)庫錯(cuò)誤信息客税,以及MySQL其他錯(cuò)誤信息,由于篇幅問題就不一一講解了撕贞。

2.2更耻、and大法和or大法

頁面不返回任何錯(cuò)誤信息,我們就可以借助本方法來推斷了捏膨,首先我們?cè)趨?shù)后面加上 and 1=1和and 1=2看看有什么不同

可以發(fā)現(xiàn)and 1=1 返回了數(shù)據(jù)秧均,而and 1=2沒有,這是由于1=1是一個(gè)為真的條件号涯,前面的結(jié)果是true目胡,true and true 所以沒有任何問題,第二個(gè) 1=2 是個(gè)假條件链快, true and false還是false誉己,所以并沒有數(shù)據(jù)返回。

好域蜗,講完and巨双,我們自來看看 or ,or就是或者霉祸,兩個(gè)都為假筑累,才會(huì)為假。我們先把id改為5丝蹭,可以發(fā)現(xiàn)id=5是沒有數(shù)據(jù)的疼阔。

可以發(fā)現(xiàn)我們加上or 1=1就成功返回了數(shù)據(jù),這是因?yàn)?=1為真半夷,不管前面是不是假,數(shù)據(jù)都會(huì)返回迅细,這樣就把表里面數(shù)據(jù)全部返回巫橄,我們沒看見,是因?yàn)榇a中并沒有迭代輸出茵典。這樣湘换,我們來修改一下代碼。

[PHP]純文本查看復(fù)制代碼

?

01

02

03

04

05

06

07

08

09

10

11

12echo"";

id

username

echo"";

//遍歷查詢結(jié)果

while($result= mysql_fetch_array($sql)) {

".$result[0] ."

".$result[1] ."

echo"";

}

然后你就可以發(fā)現(xiàn):

2.3、加法和減法

這里我們需要區(qū)分一下數(shù)字型和字符串型:

數(shù)字型:不需要使用單引號(hào)來表示

其他類型:使用單引號(hào)來表示

綜合上述彩倚,我們可以發(fā)現(xiàn)我們的例子是數(shù)字型的筹我,這樣我們就可以使用加法和減法來判斷了。

加法帆离,我們?cè)趨?shù)輸入1+1蔬蕊,看看返回的數(shù)據(jù)是不是id等于2的結(jié)果,這里注意一下+號(hào)在SQL語句是有特效含義的哥谷,所以我們要對(duì)其進(jìn)行url編碼岸夯,最后也就是%2b。

減法是同樣的道理们妥,不過我們不需要對(duì)-號(hào)進(jìn)行url編碼了猜扮。

結(jié)束語

感謝大家的支持吧,在此我也總結(jié)一下前面自己的不足监婶,由于篇幅很長(zhǎng)旅赢,寬度是到位了,但是并沒有深入惑惶,也不算詳細(xì)煮盼,所以本篇教程分為了三級(jí)即初級(jí)、中級(jí)集惋、高級(jí)孕似。六節(jié)來寫,既要深度也要寬度刮刑,當(dāng)然我也不是技術(shù)大牛喉祭,如文中有錯(cuò)誤請(qǐng)指出,我會(huì)加以改正雷绢,謝謝泛烙。

系列文章預(yù)告及導(dǎo)航

滲透攻防Web篇-SQL注入攻擊中級(jí)(狀態(tài):更新中)

第三節(jié) 利用SQL注入

第四節(jié) SQL盲注利用

滲透攻防Web篇-SQL注入攻擊高級(jí)(狀態(tài):更新中)

第五節(jié) 避開過濾方法總結(jié)

第六節(jié) 探討SQL注入防御技巧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翘紊,隨后出現(xiàn)的幾起案子蔽氨,更是在濱河造成了極大的恐慌,老刑警劉巖帆疟,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹉究,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡踪宠,警方通過查閱死者的電腦和手機(jī)自赔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柳琢,“玉大人绍妨,你說我怎么就攤上這事润脸。” “怎么了他去?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵毙驯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我灾测,道長(zhǎng)爆价,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任行施,我火速辦了婚禮允坚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛾号。我一直安慰自己稠项,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布鲜结。 她就那樣靜靜地躺著展运,像睡著了一般。 火紅的嫁衣襯著肌膚如雪精刷。 梳的紋絲不亂的頭發(fā)上拗胜,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音怒允,去河邊找鬼埂软。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纫事,可吹牛的內(nèi)容都是我干的勘畔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丽惶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼炫七!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钾唬,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤万哪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抡秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奕巍,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年儒士,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了的止。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乍桂,死狀恐怖冲杀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睹酌,我是刑警寧澤权谁,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站憋沿,受9級(jí)特大地震影響旺芽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辐啄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一采章、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壶辜,春花似錦悯舟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岭参,卻和暖如春反惕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背演侯。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工姿染, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秒际。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓悬赏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親程癌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舷嗡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容