代码审计keys

@addslashes()
在挖掘SQL注入漏洞时,只要参数在拼接到SQL语句前除非有宽字节注入或者其他特殊情况,否则使用了这个函数就不能注入了。
类似:mysql_[real_]escape_string()

@文件上传有可能含有sql注入漏洞,当文件名被保存到数据库时。

@PHP输出函数(xss)
print, print_r, ehco, printf, sprintf, die, var_dump, var_export

@截断问题
1.%00截断
由于php是C语言写的,在C语言中\0代表字符串结束,因此php中可用%00来截断。
在开启gpc的情况下不可使用
PHP 5.3 后修复了该问题
此外文件名中chr(128) - chr(255)都可以截断字符

2.利用多个句号(.)和反斜杠(\)截断
此方式不受gpc限制,但同样在PHP 5.3 后修复
Windows下240个连接的点(.)可以截断,同样点(.)加反斜杠(\)也是240个。
Linux下2038个\.组合才能截断

3.远程文件包含时可用'?'截断,不受gpc和php版本限制。

@php文件读取函数(文件读取漏洞)
file_get_contents(), highlight_file(), fopen(), readfile(), fread(), fgetss(), fgets(), parse_ini_file(), show_source(), file(),以及php://filter

@../跳过目录
?url=&q=../../1.php这样多加两个"../",把"&q="当成目录跳过

@代码执行函数
eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map(),以及PHP动态函数($a($b))

@命令执行函数
system(), exec(), shell_exec(), passthru(), pcntl_exec(), popen(), proc_open()

@命令防注入函数
escapeshellcmd() 过滤字符,单双引号在不成对时被转义。
escapeshellarg() 将参数放在一对引号里,确保参数时字符串。
        参数中的双引号会被删除,参数首尾的双引号变为空格,最后用一对双引号将参数包裹。
        172.17.0.2" -v -d a=1""   =>  "172.17.0.2 -v -d a=1 "
注:两个函数同时使用容易出问题   传送门

@变量覆盖
1.extract()
2.parse_str()
3.import_request_variables() 在没有开启全局变量注册时,调用这个函数相当于开启了。
PHP4 - 4.1.0 和 PHP5 - 5.4.0可用

@问题函数
1.in_array() 会进行自动类型转换
2.is_nummeric() 当传入参数为hex时也可通过检测,而mysql中可以通过hex代替字符明文,可能存在整形sql注入。
3.====== 落类型比较
4.
strcmp()
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0。
6.intval()

intval('2e4') = 2
'2e4'+1 = float(20001)
intval('2e4'+1) = 20001
you pass!

7.basename()

NO.3-10 [Zer0pts2020]Can you guess it?_nigo134的博客-CSDN博客

@sql报错注入函数
floor(), updatexml(), extractvalue(), GeometryCollection(), polygon(), GTID_SUBSET(), multipoint(),multilinestring(), multipolygon(), LINESTRING(), exp()

@windows FiindFirsFile
flag = f<<

@php可变变量
${@phpinfo()} '@'必须有,可替代字符:空格,TAB,/**/,回车,+,-,!,~,\ 等

gpio-keys 是 Linux 内核中的一个模块,用于将 GPIO 按键映射为键盘上的按键,以便用户可以使用 GPIO 按键来与系统进行交互。在本文中,我将对 gpio-keys 模块的代码进行分析。 首先,我们需要了解的是 gpio-keys 模块的注册和注销过程。在模块初始化期间,我们需要调用 `gpio_keys_probe()` 函数来注册模块,该函数会注册一个 platform 设备,并将其与 gpio_keys_driver 结构体相关联。这个结构体包含了模块的名称、ID、设备树匹配以及一些回调函数。注册完成后,内核就会调用 `gpio_keys_irq()` 函数来设置 GPIO 中断并处理按键事件。 下面是 `gpio_keys_probe()` 函数的代码: ```c static int gpio_keys_probe(struct platform_device *pdev) { struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; struct gpio_keys_button *button; struct input_dev *input; int error, i; ... /* Allocate input device */ input = input_allocate_device(); if (!input) { dev_err(&pdev->dev, "Failed to allocate input device\n"); error = -ENOMEM; goto err_free_desc; } /* Set input device properties */ input->name = pdata->input_name ?: "gpio-keys"; input->dev.parent = &pdev->dev; set_bit(EV_KEY, input->evbit); for (i = 0, button = pdata->buttons; i < pdata->nbuttons; i++, button++) { input_set_capability(input, EV_KEY, button->code); } /* Register input device */ error = input_register_device(input); if (error) { dev_err(&pdev->dev, "Failed to register input device\n"); goto err_free_dev; } /* Allocate and configure gpio_keys_device */ gkd = devm_kzalloc(&pdev->dev, sizeof(*gkd), GFP_KERNEL); if (!gkd) { error = -ENOMEM; goto err_free_dev; } gkd->pdev = pdev; gkd->input = input; gkd->n_buttons = pdata->nbuttons; gkd->buttons = pdata->buttons; /* Request and configure GPIOs */ for (i = 0, button = pdata->buttons; i < pdata->nbuttons; i++, button++) { error = gpio_request(button->gpio, button->desc); if (error) { dev_err(&pdev->dev, "Failed to request gpio %d: %d\n", button->gpio, error); goto err_free_gpio; } error = gpio_direction_input(button->gpio); if (error) { dev_err(&pdev->dev, "Failed to configure gpio %d: %d\n", button->gpio, error); goto err_free_gpio; } } /* Register IRQ handlers */ for (i = 0, button = pdata->buttons; i < pdata->nbuttons; i++, button++) { error = gpio_request(button->gpio, button->desc); if (error) { dev_err(&pdev->dev, "Failed to request gpio %d: %d\n", button->gpio, error); goto err_free_irq; } error = request_irq(gpio_to_irq(button->gpio), gpio_keys_irq, button->irqflags, button->desc, gkd); if (error) { dev_err(&pdev->dev, "Failed to register IRQ for gpio %d: %d\n", button->gpio, error); goto err_free_irq; } } /* Store private data */ platform_set_drvdata(pdev, gkd); return 0; err_free_irq: while (--i >= 0) { button--; free_irq(gpio_to_irq(button->gpio), gkd); } goto err_free_gpio; err_free_gpio: while (--i >= 0) { button--; gpio_free(button->gpio); } err_free_dev: input_free_device(input); err_free_desc: for (i = 0, button = pdata->buttons; i < pdata->nbuttons; i++, button++) { kfree(button->desc); } return error; } ``` 在 `gpio_keys_probe()` 函数中,我们首先为输入设备分配内存,然后设置输入设备的属性,如名称、上级设备、事件类型和按键能力。接下来,我们为每个按键分配 GPIO,并将其配置为输入模式。最后,我们为每个按键注册中断处理程序,并将私有数据存储在 platform 设备的私有数据区域中。 一旦模块已注册并初始化,内核就可以使用 `gpio_keys_irq()` 函数来处理按键事件。该函数会检查哪个按键被按下或释放,并将事件发送到输入子系统。 下面是 `gpio_keys_irq()` 函数的代码: ```c static irqreturn_t gpio_keys_irq(int irq, void *dev_id) { struct gpio_keys_device *gkd = dev_id; struct gpio_keys_button *button; struct input_dev *input = gkd->input; unsigned int state; int i; /* Check each button */ for (i = 0, button = gkd->buttons; i < gkd->n_buttons; i++, button++) { state = gpio_get_value(button->gpio); if (state != button->active_low) continue; /* Send event to input subsystem */ input_report_key(input, button->code, 1); input_sync(input); input_report_key(input, button->code, 0); input_sync(input); } return IRQ_HANDLED; } ``` 在 `gpio_keys_irq()` 函数中,我们遍历每个按键并检查其状态。如果按键被按下,则我们发送 “按下” 事件;如果按键被释放,则我们发送 “释放” 事件。最后,我们将事件同步到输入子系统。 总的来说,gpio-keys 模块是一个非常有用的内核模块,它允许用户通过 GPIO 按键与系统进行交互。通过分析其代码,我们可以更好地了解内核模块是如何工作的,并且可以更好地理解 linux 内核的编程模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值