上次说到工具注入的天花板,burpsuite和sqlmap联动注入SQL漏洞。
用burpsuite和sql联动工具注入漏洞_mammal7的博客-CSDN博客
但是工具注入并不是万能的,并且,只使用工具注入的话,会被称为“脚本小子”,当然这是一个贬义词。 工具注入的缺点还是很多的,例如:大部分目标网站会开启安全设备,会禁ping,禁扫描,封ip等。网站都进不去就别提注入了。
那么,手工注入就是我们的必要手段。可以避开抓包等繁琐的中间过程,直接注入漏洞。
首先,我们要了解SQL注入漏洞是对网站的数据库进行读取。那么就要针对网站的数据库写相应的语句。(以获取dvwa靶场中,admin,password为例)
主要步骤如下:
1.找交互点
启动phpstudy,保证Apache和Mysql处于绿灯状态。打开firefox浏览器,输入127.0.0,1/dvwa.master,进入dvwa靶场。
进入DVWA Security,将安全等级改为low等级。
在SQL injection的左下角检查安全等级是否为low。
在User ID中输入1,观察url的回显结果。
发现?id=1请求,说明这是一个交互点。
2.找注入点
User ID 或者顶部栏中,1后面加一个',观察回显结果。
页面显示error,在1后,说明id=1是一个注入点。
3.判断类型(int 类型,char 类型)
两个类型决定了后续语句的写法,至关重要。
输入语句1 and 1=1(这个结果为真)
输入语句1 and 1=2(这个结果为假)
分别观察两个网页的回显结果。发现这两个url的回显结果是一样的。判断出注入类型为char类型。那么后续的所有手工注入语句要在int类型的基础上,输入‘闭合 #注释。
4.判断列数(order by 语句)
输入语句:1'order by **# (由于不知道列数,采用二分法可大大提高效率)
输入语句1' order by 1#,观察回显结果。
发现页面正常显示,说明存在一个列。
接着输入语句1' order by 10#,观察回显结果。
这里显示不存在,说明列数没有10个,用二分法查找order by 5。
这里依然显示不存在,说明列数没有5个。以此类推,用二分法继续查找,直到页面正常显示。
在用二分法反复尝试后,发现3列不存在,2列正常显示,说明网站存在2个列。
5.看回显位置(union select)
用联合查找语句获取对应列的位置,观察回显结果。
输入语句:1' and 1=2 union select 1,2#
and 1=2:防止原网站显示,对信息的获取产生干扰,令原网站为假。
发现两个列对应位置。猜测admin 和 password在2列中。
6.读取数据库的名称(database())
输入语句:1' and 1=2 union select 1,database()# 观察回显结果。
读取到surname中数据库名称为dvwa,那接下去就好办了,数据表,数据列,读取数据逐个击破。
7.读取数据表的名称 (table_name)
输入语句:1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='dvwa'# 观察回显结果。
Information_schema:数据库名,所有网站的数据库都在里面,tables是其中的一张表(存储着所有网站的数据表名称),用.来列出。
table_shcema=’dvwa’表示获取table_schema数据库中dvwa的数据表名,也就是我们要的。
获取到两个表名,guestbook和users。猜测admin 和 password在users中。
8.读取数据列的名称(column_name)
语句与table_name 类似。输入语句:1' and 1=2 union select 1,column_name from information_schema.columns where table_name='users'# 观察回显结果。
可以查到对应列的名称。猜测admin 和 password在user 和 password列中。
9. 读取数据 (concat)
最后一步当然是读取数据啦。输入语句:1' and 1=2 union select 1,concat(user,password) from users#
concat:连接两个要查找的列。
这里会看到一长串数字和字母,无法判断admin和password。这里可以在concat中加一个字符隔开。例如(user,' ',password),这样就能很清楚的区分admin和password啦。
将读到的数据用md5解密后,就可以获取到明文的账号密码了。怎么样,手工注入SQL漏洞是不是很酷呢!
另外声明一下,这个靶场是char类型的,如果判断出是int类型的话,只需将语句中' 和# 删除,其他语句一摸一样。