Ⅰ sql 查詢 一個表中某幾列數據
查詢表格中的指定列數據,是select
語句其中一種語法
即:select
columna,columnb
from
table
如表格table有列
a,b,c,d
1、select
*
from
table
=
select
a,b,c,d
from
table
即顯示表格式所以列
2、select
a,b
from
table
即指定顯示表格式a,b兩列
Ⅱ sql怎麼查詢一個資料庫所有表列數
--讀取庫中的所有表名
select name from sysobjects where xtype='u'
--讀取指定表的所有列名
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
獲取資料庫表名和欄位
sqlserver中各個系統表的作用
sysaltfiles 主資料庫 保存資料庫的文件
syscharsets 主資料庫 字元集與排序順序
sysconfigures 主資料庫 配置選項
syscurconfigs 主資料庫 當前配置選項
sysdatabases 主資料庫 伺服器中的資料庫
syslanguages 主資料庫 語言
syslogins 主資料庫 登陸帳號信息
sysoledbusers 主資料庫 鏈接伺服器登陸信息
sysprocesses 主資料庫 進程
sysremotelogins主資料庫 遠程登錄帳號
syscolumns 每個資料庫 列
sysconstrains 每個資料庫 限制
sysfilegroups 每個資料庫 文件組
sysfiles 每個資料庫 文件
sysforeignkeys 每個資料庫 外部關鍵字
sysindexs 每個資料庫 索引
sysmenbers 每個資料庫 角色成員
sysobjects 每個資料庫 所有資料庫對象
syspermissions 每個資料庫 許可權
systypes 每個資料庫 用戶定義數據類型
select 列名=name from syscolumns where id=object_id(N'要查的表名')
Ⅲ sql 查詢 一個表中某幾列數據
sql查詢一個表中某幾列數據語法:
1、SELECT 列名稱1、列名稱2.....列名稱n FROM 表名稱 WHERE 列 運算符 值;
2、SELECT * from 表名稱 where 列 運算符 值(列 運算符 值,這個可以是多個,中間用and隔開)。
解析:使用sql查詢時,作為查詢的篩選限制條件,只需要對有限制要求的欄位使用where進行限制即可,無需對非限制要求的欄位進行特別限制。
所以你的語句可以修改為"select * from test1 where id=『2』;"就可以了。其中,你原語句中的name=全部和age=全部,屬於多餘的,如果不對name和age欄位做任何限制的話,sql本身就是會查詢全部name和age,而無需你另外加設條件。
再比如你這樣寫:「select * from test1;」在不加任何where條件的情況下,這個sql查詢本身就是查詢全部數據。而當加入id='2'之後,就限制了只能返回id值是2的某一條或者多條數據。
通過幾個例子來加深一下對上表各查詢條件使用的理解:
1、查詢計算機科學系全體學生的名單;
SELECT Sname FROM StudentWHERE Sdept='CS';
2、查詢所有年齡在20歲以下的學生姓名及其年齡;
SELECT Sname,Sage FROM StudentWHERE Sage<20;
3、查詢考試成績不合格的學生的學號;
SELECT DISTINCT Sno FROM SCWHERE Grade<60;
4、查詢年齡在20~23歲之間的學生的姓名、系別和年齡;
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
5、查詢年齡在20~23歲之間的學生的姓名、系別和年齡;
SELECT Sname,Sdept,Sage FROM StudentWHERE Sage NOT BETWEEN 20 AND 23;
6、查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名、系別和年齡。
SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS','MA','IS')。
Ⅳ sql 查詢 一個表中某幾列數據
所有數據可以用到sql中的通配符%,用來進行模糊查詢。
用法是 select
*
from
test1
where
id=『2』and
name
like
'%'
and
age like
'%',表示從test1表中查詢id為2,name和age任意的數據。
1、為了對比前後查詢數據,先查詢表test1中的所有數據,select
*
from
test1,如下圖所示。
2、再用通配符%進行模糊查詢,select
*
from
test1 where
id='2'
and
name
like
'%'
and
age
like
'%',可以看到篩選後後的結果除去了id為1的數據。
(4)sql注入查詢表的列數擴展閱讀:
sql語言中還有其它的通配符,例如「_」,它表示僅代替一個字元,從"Persons"
表中選取名字的第一個字元之後是
"eorge"
的人,SELECT
*
FROM
表名
WHERE
列名LIKE
'_eorge'。
通配符[charlist]代表字元列中的任何單一字元,從
"Persons"
表中選取居住的城市以
"A"
或
"L"
或
"N"
開頭的人,SELECT
*
FROM
Persons
WHERE
City
LIKE
'[ALN]%'。
Ⅳ sql語句查詢一個表的列數
看的出來你初學,可以先看看資料庫基礎,以EXCEL表格的方法給你講一遍。
count(name) 查找出來的行數(看成EXCEL中以某一些條件找出來的行數)
syscolumns 表的名字 (看成EXCEL中的工作表A名)
id 表裡的一個欄位 (看出EXCEL中的某一列)
sysobjects 表的名字 (看成EXCEL中的工作表B名)
xtype='u' 一個欄位=U (看出EXCEL中的某一列=U這個字元)
Ⅵ 部分sql注入總結
本人ctf選手一名,在最近做練習時遇到了一些sql注入的題目,但是sql注入一直是我的弱項之一,所以寫一篇總結記錄一下最近學到的一些sql注入漏洞的利用。
在可以聯合查詢的題目中,一般會將資料庫查詢的數據回顯到首頁面中,這是聯合注入的前提。
適用於有回顯同時資料庫軟體版本是5.0以上的MYSQL資料庫,因為MYSQL會有一個系統資料庫information_schema, information_schema 用於存儲資料庫元數據(關於數據的數據),例如資料庫名、表名、列的數據類型、訪問許可權等
聯合注入的過程:
判斷注入點可以用and 1=1/and 1=2用於判斷注入點
當注入類型為數字型時返回頁面會不同,但都能正常執行。
sql注入通常為數字型注入和字元型注入:
1、數字型注入
數字型語句:
在這種情況下直接使用and 1=1/and 1=2是都可以正常執行的但是返回的界面是不一樣的
2、字元型注入
字元型語句:
字元型語句輸入我們的輸入會被一對單引號或這雙引號閉合起來。
所以如果我們同樣輸入and 1=1/and 1=2會發現回顯畫面是並無不同的。
在我們傳入and 1=1/and 1=2時語句變為
傳入的東西變成了字元串並不會被當做命令。
所以字元型的測試方法最簡單的就是加上單引號 ' ,出現報錯。
加上注釋符--後正常回顯界面。
這里還有的點就是sql語句的閉合也是有時候不同的,下面是一些常見的
這一步可以用到order by函數,order by 函數是對MySQL中查詢結果按照指定欄位名進行排序,除了指定字 段名還可以指定欄位的欄位進行排序,第一個查詢欄位為1,第二個為2,依次類推,所以可以利用order by就可以判斷列數。
以字元型注入為例:
在列數存在時會正常回顯
但是列數不存在時就會報錯
這步就說明了為什麼是聯合注入了,用到了UNION,UNION的作用是將兩個select查詢結果合並
但是程序在展示數據的時候通常只會取結果集的第一行數據,這就讓聯合注入有了利用的點。
當我們查詢的第一行是不存在的時候就會回顯第二行給我們。
講查詢的數據置為-1,那第一行的數據為空,第二行自然就變為了第一行
在這個基礎上進行注入
可以發現2,3都為可以利用的顯示點。
和前面一樣利用union select,加上group_concat()一次性顯示。
現在非常多的Web程序沒有正常的錯誤回顯,這樣就需要我們利用報錯注入的方式來進行SQL注入了
報錯注入的利用步驟和聯合注入一致,只是利用函數不同。
以updatexml為例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路徑(Xpath格式)
new_xml: 更新後的內容
此函數用來更新選定XML片段的內容,將XML標記的給定片段的單個部分替換為 xml_target 新的XML片段 new_xml ,然後返回更改的XML。xml_target替換的部分 與xpath_expr 用戶提供的XPath表達式匹配。
這個函數當xpath路徑錯誤時就會報錯,而且會將路徑內容返回,這就能在報錯內容中看到我們想要的內容。
而且以~開頭的內容不是xml格式的語法,那就可以用concat函數拼接~使其報錯,當然只要是不符合格式的都可以使其報錯。
[極客大挑戰 2019]HardSQL
登錄界面嘗試注入,測試後發現是單引號字元型注入,且對union和空格進行了過濾,不能用到聯合注入,但是有錯誤信息回顯,說明可以使用報錯注入。
利用updatexml函數的報錯原理進行注入在路徑處利用concat函數拼接~和我們的注入語句
發現xpath錯誤並執行sql語句將錯誤返回。
在進行爆表這一步發現了等號也被過濾,但是可以用到like代替等號。
爆欄位
爆數據
這里就出現了問題flag是不完整的,因為updatexml能查詢字元串的最大長度為32,所以這里要用到left函數和right函數進行讀取
報錯注入有很多函數可以用不止updatexml一種,以下三種也是常用函數:
堆疊注入就是多條語句一同執行。
原理就是mysql_multi_query() 支持多條sql語句同時執行,用;分隔,成堆的執行sql語句。
比如
在許可權足夠的情況下甚至可以對資料庫進行增刪改查。但是堆疊注入的限制是很大的。但是與union聯合執行不同的是它可以同時執行無數條語句而且是任何sql語句。而union執行的語句是有限的。
[強網杯 2019]隨便注
判斷完注入類型後嘗試聯合注入,發現select被過濾,且正則不區分大小寫過濾。
那麼就用堆疊注入,使用show就可以不用select了。
接下去獲取表信息和欄位信息
那一串數字十分可疑大概率flag就在裡面,查看一下
這里的表名要加上反單引號,是資料庫的引用符。
發現flag,但是沒辦法直接讀取。再讀取words,發現裡面有個id欄位,猜測資料庫語句為
結合1'or 1=1#可以讀取全部數據可以利用改名的方法把修改1919810931114514為words,flag修改為id,就可以把flag讀取了。
最終payload:
盲注需要掌握的幾個函數
在網頁屏蔽了錯誤信息時就只能通過網頁返回True或者False判斷,本質上是一種暴力破解,這就是布爾盲注的利用點。
首先,判斷注入點和注入類型是一樣的。
但是盲注沒有判斷列數這一步和判斷顯示位這兩步,這是和可回顯注入的不同。
判斷完注入類型後就要判斷資料庫的長度,這里就用到了length函數。
以[WUSTCTF2020]顏值成績查詢為例
輸入參數後,發現url處有個get傳入的stunum
然後用到length函數測試是否有注入點。
發現頁面有明顯變化
將傳入變為
頁面回顯此學生不存在
那麼就可以得出資料庫名長度為3
測試發現過濾了空格
然後就是要查資料庫名了,這里有兩種方法
一、只用substr函數,直接對比
這種方法在寫腳本時可以用於直接遍歷。
二、加上ascii函數
這個payload在寫腳本時直接遍歷同樣可以,也可用於二分法查找,二分法速度更快。
接下來的步驟就和聯合注入一樣,只不過使用substr函數一個一個截取字元逐個判斷。但是這種盲注手工一個一個注十分麻煩所以要用到腳本。
直接遍歷腳本
二分法腳本
時間盲注用於代碼存在sql注入漏洞,然而頁面既不會回顯數據,也不會回顯錯誤信息
語句執行後也不提示真假,我們不能通過頁面的內容來判斷
所以有布爾盲注就必有時間盲注,但有時間盲注不一定有布爾盲注
時間盲注主要是利用sleep函數讓網頁的響應時間不同從而實現注入。
sql-lab-less8:
無論輸入什麼都只會回顯一個you are in...,這就是時間盲注的特點。
當正常輸入?id=1時時間為11毫秒
判斷為單引號字元型注入後,插入sleep語句
明顯發現響應時間為3053毫秒。
利用時間的不同就可以利用腳本跑出資料庫,後續步驟和布爾盲注一致。
爆庫
爆表
爆欄位
腳本
在進行SQL注入時,發現union,and,or被完全過濾掉了,就可以考慮使用異或注入
什麼是異或呢
異或是一種邏輯運算,運演算法則簡言之就是:兩個條件相同(同真或同假)即為假(0),兩個條件不同即為真(1),null與任何條件做異或運算都為null,如果從數學的角度理解就是,空集與任何集合的交集都為空
即 1^1=0,0^0=0,1^0=1
利用這個原理可以在union,and,or都被過濾的情況下實現注入
[極客大挑戰 2019]FinalSQL
給了五個選項但是都沒什麼用,在點擊後都會在url處出現?id。
而且union,and,or都被過濾
測試發現?id=1^1會報錯
但是?id=1^0會返回?id=1的頁面,這就是前面說的原理,當1^0時是等於1的所以返回?id=1的頁面。
根據原理寫出payload,進而寫出腳本。
爆庫
爆表
爆欄位
據此可以寫出基於異或的布爾盲注腳本
實驗推薦:課程:SQL注入初級(合天網安實驗室)
Ⅶ sql語句中查詢含有a數據的列數,b數據的列數,c數據的列數
select count(a) as 'count(a)',
count(b) as 'count(b)',
count(c) as 'count(c)'
from t1
這樣就行了啊。
count(a),他只計算a不為空的列數。結果是2.
Ⅷ 如何通過SQL語句查詢出表中的列數
是MSSQL SERVER吧,
在MASTER庫里或你自己的庫里,不是有一些默認的表嗎,就是記錄這些信息的。記不住了。自己找找看。
Ⅸ sql語句如何實現實現查詢多列的數據
可以,我看Id列應該是唯一的吧。根據proctID分組的時候,取max(id),然後通過此id關聯,就可以把其他列數據也查詢出來了